国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機(jī)|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識(shí)|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - Nginx - 詳解用ELK來分析Nginx服務(wù)器日志的方法

詳解用ELK來分析Nginx服務(wù)器日志的方法

2019-11-11 14:25葉劍峰 Nginx

這篇文章主要介紹了用ELK來分析Nginx服務(wù)器日志的方法,ELK是三個(gè)開源軟件的縮寫,分別表示Elasticsearch,Logstash,Kibana,需要的朋友可以參考下

所有ELK的安裝包都可以去官網(wǎng)下載,雖然速度稍慢,但還可以接受,官網(wǎng)地址:https://www.elastic.co/

logstash

在Logstash1.5.1版本,pattern的目錄已經(jīng)發(fā)生改變,存儲(chǔ)在/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-0.1.10/目錄下,但是好在配置引用的時(shí)候是可以對(duì)patterns的目錄進(jìn)行配置的,所以本人在Logstash的根目錄下新建了一個(gè)patterns目錄。而配置目錄在1.5.1版本中也不存在了,如果是rpm包安裝的,可以在/etc/logstash/conf.d/下面進(jìn)行配置,但個(gè)人測(cè)試多次,這樣啟動(dòng)經(jīng)常性的失敗,目前還沒有去分析原因(個(gè)人不推薦使用RPM包安裝)。所以大家可以采用Nohup或者screen的方式進(jìn)行啟動(dòng)
專屬nginx的pattern配置:

 

復(fù)制代碼 代碼如下:


NGINXACCESS %{IP:client} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|-)\" %{HOST:domain} %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:useragent} "(%{IP:x_forwarder_for}|-)"

 

 

 

由于是測(cè)試環(huán)境,我這里使用logstash讀取nginx日志文件的方式來獲取nginx的日志,并且僅讀取了nginx的access log,對(duì)于error log沒有關(guān)心。

使用的logstash版本為2.2.0,在log stash程序目錄下創(chuàng)建conf文件夾,用于存放解析日志的配置文件,并在其中創(chuàng)建文件test.conf,文件內(nèi)容如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
input {
  file {
    path => ["/var/log/nginx/access.log"]
  }
}
filter {
  grok {
    match => {
      "message" => "%{IPORHOST:clientip} \[%{HTTPDATE:time}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:http_status_code} %{NUMBER:bytes} \"(?<http_referer>\S+)\" \"(?<http_user_agent>\S+)\" \"(?<http_x_forwarded_for>\S+)\""
    }
  
}
output {
  elasticsearch {
    hosts => ["10.103.17.4:9200"]
    index => "logstash-nginx-test-%{+YYYY.MM.dd}"
    workers => 1
    flush_size => 1
    idle_flush_time => 1
    template_overwrite => true
  }
  stdout{codec => rubydebug}
}

需要說明的是,filter字段中的grok部分,由于nginx的日志是格式化的,logstash解析日志的思路為通過正則表達(dá)式來匹配日志,并將字段保存到相應(yīng)的變量中。logstash中使用grok插件來解析日志,grok中message部分為對(duì)應(yīng)的grok語法,并不完全等價(jià)于正則表達(dá)式的語法,在其中增加了變量信息。

具體grok語法不作過多介紹,可以通過logstash的官方文檔中來了解。但grok語法中的變量類型如IPORHOST并未找到具體的文檔,只能通過在logstash的安裝目錄下通過grep -nr "IPORHOST" .來搜索具體的含義。

配置文件中的stdout部分用于打印grok解析結(jié)果的信息,在調(diào)試階段一定要打開。

可以通過這里來驗(yàn)證grok表達(dá)式的語法是否正確,編寫grok表達(dá)式的時(shí)候可以在這里編寫和測(cè)試。

對(duì)于elasticsearch部分不做過多介紹,網(wǎng)上容易找到資料。


elk收集分析nginx access日志

使用redis的push和pop做隊(duì)列,然后有個(gè)logstash_indexer來從隊(duì)列中pop數(shù)據(jù)分析插入elasticsearch。這樣做的好處是可擴(kuò)展,logstash_agent只需要收集log進(jìn)入隊(duì)列即可,比較可能會(huì)有瓶頸的log分析使用logstash_indexer來做,而這個(gè)logstash_indexer又是可以水平擴(kuò)展的,我可以在單獨(dú)的機(jī)器上跑多個(gè)indexer來進(jìn)行日志分析存儲(chǔ)。

好了,現(xiàn)在進(jìn)一步配置了。

nginx中的日志存儲(chǔ)格式

nginx由于有g(shù)et請(qǐng)求,也有post請(qǐng)求,get請(qǐng)求的參數(shù)是會(huì)直接顯示在日志的url中的,但是post請(qǐng)求的參數(shù)呢,卻不會(huì)在access日志中體現(xiàn)出來。那么我想要post的參數(shù)也進(jìn)行存儲(chǔ)紀(jì)錄下來。就需要自己定義一個(gè)log格式了。

 

復(fù)制代碼 代碼如下:

 

log_format logstash '$http_host $server_addr $remote_addr [$time_local] "$request" $request_body $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $upstream_response_time';

 


這里的requestbody里面存放的就是POST請(qǐng)求的body了,然后GET請(qǐng)求的參數(shù)在requestbody里面存放的就是POST請(qǐng)求的body了,然后GET請(qǐng)求的參數(shù)在request里面。具體怎么分析,我們?cè)趇ndexer中再想。

 

這里的server_addr存放的是當(dāng)前web機(jī)器的IP,存這個(gè)IP是為了分析日志的時(shí)候可以分析日志的原始來源。

下面是一個(gè)GET請(qǐng)求的例子:

 

復(fù)制代碼 代碼如下:

 

 

api.yejianfeng.com 10.171.xx.xx 100.97.xx.xx [10/Jun/2015:10:53:24 +0800] "GET /api1.2/qa/getquestionlist/?limit=10&source=ios&token=12343425324&type=1&uid=304116&ver=1.2.379 HTTP/1.0" - 200 2950 "-" "TheMaster/1.2.379 (iPhone; iOS 8.3; Scale/2.00)" 0.656 0.654

 


下面是一個(gè)POST請(qǐng)求的例子:

 

 

復(fù)制代碼 代碼如下:

 

 

api.yejianfeng.com 10.171.xx.xx 100.97.xx.xx [10/Jun/2015:10:53:24 +0800] "POST /api1.2/user/mechanicupdate/ HTTP/1.0" start_time=1276099200&lng=110.985723&source=android&uid=328910&lat=35.039471&city=140800 200 754 "-" "-" 0.161 0.159

 


順便說下,這里知識(shí)在nginx.conf中定義了一個(gè)日志格式,還要記得在具體的服務(wù)中加入日志存儲(chǔ)。比如

 

?
1
2
3
listen    80;
server_name api.yejianfeng.com;
access_log /mnt/logs/api.yejianfeng.com.logstash.log logstash;

log_agent的配置

這個(gè)配置就是往redis隊(duì)列中塞入日志就行。output的位置設(shè)置為redis就行。

input {
        file {
                type => "nginx_access"
                path => ["/mnt/logs/api.yejianfeng.com.logstash.log"]
        }
}
output {
        redis {
                host => "10.173.xx.xx"
                port => 8001
                password => pass
                data_type => "list"
                key => "logstash:redis"
        }
}
log_indexer的配置

log_indexer的配置就比較麻煩了,需要配置的有三個(gè)部分

input: 負(fù)責(zé)從redis中獲取日志數(shù)據(jù)
filter: 負(fù)責(zé)對(duì)日志數(shù)據(jù)進(jìn)行分析和結(jié)構(gòu)化
output: 負(fù)責(zé)將結(jié)構(gòu)化的數(shù)據(jù)存儲(chǔ)進(jìn)入elasticsearch
input部分

?
1
2
3
4
5
6
7
8
9
input {
    redis {
        host => "10.173.xx.xx"
        port => 8001
        password => pass
        data_type => "list"
        key => "logstash:redis"
    }
}

其中的redis配置當(dāng)然要和agent的一致了。

filter部分
解析文本可以使用grokgrok debug進(jìn)行分析,參照著之前的log格式,需要一個(gè)個(gè)進(jìn)行日志分析比對(duì)。這個(gè)grok語法寫的還是比較復(fù)雜的,還好有在線grok比對(duì)工具可以使用。比對(duì)前面的GET和POST的日志格式,修改出來的grok語句如下:

 

復(fù)制代碼 代碼如下:

 

%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}

 


這里使用了一點(diǎn)小技巧,params的使用,為了讓GET和POST的參數(shù)都反映在一個(gè)參數(shù)上,在對(duì)應(yīng)的GET和POST的參數(shù)的地方,都設(shè)計(jì)使用params這個(gè)參數(shù)進(jìn)行對(duì)應(yīng)。

 

好了,現(xiàn)在params中是請(qǐng)求的參數(shù)。比如source=ios&uid=123。但是呢,最后做統(tǒng)計(jì)的時(shí)候,我希望得出的是“所有source值為ios的調(diào)用”,那么就需要對(duì)參數(shù)進(jìn)行結(jié)構(gòu)化了。而且我們還希望如果接口中新加入了一個(gè)參數(shù),不用修改logstash_indexer就可以直接使用,方法就是使用kv,kv能實(shí)現(xiàn)對(duì)一個(gè)字符串的結(jié)構(gòu)進(jìn)行k=v格式的拆分。其中的參數(shù)prefix可以為這個(gè)key在統(tǒng)計(jì)的時(shí)候增加一個(gè)前綴,include_keys可以設(shè)置有哪些key包含在其中,exclude_keys可以設(shè)置要排除哪些key。

?
1
2
3
4
5
kv {
  prefix => "params."
  field_split => "&"
  source => "params"
}

好了,現(xiàn)在還有一個(gè)問題,如果請(qǐng)求中有中文,那么日志中的中文是被urlencode之后存儲(chǔ)的。我們具體分析的時(shí)候,比如有個(gè)接口是/api/search?keyword=我們,需要統(tǒng)計(jì)的是keyword被查詢的熱門順序,那么就需要解碼了。logstash牛逼的也有urldecode命令,urldecode可以設(shè)置對(duì)某個(gè)字段,也可以設(shè)置對(duì)所有字段進(jìn)行解碼。

?
1
2
3
urldecode {
  all_fields => true
}

看起來沒事了,但是實(shí)際上在運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn)一個(gè)問題,就是存儲(chǔ)到elasticsearch中的timestamp和請(qǐng)求日志中的請(qǐng)求時(shí)間不一樣。原因是es中的請(qǐng)求日志使用的是日志結(jié)構(gòu)存放進(jìn)入es的時(shí)間,而不是timestamp的時(shí)間,這里想要吧es中的時(shí)間和請(qǐng)求日志中的時(shí)間統(tǒng)一怎么辦呢?使用date命令。具體設(shè)置如下:

?
1
2
3
4
date {
    locale => "en"
    match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
}

具體的logstash_indexer中的全部配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
filter {
    grok {
      match => [
            "message", "%{IPORHOST:http_host} %{IPORHOST:server_ip} %{IPORHOST:client_ip} \[%{HTTPDATE:timestamp}\] \"%{WORD:http_verb} (?:%{PATH:baseurl}\?%{NOTSPACE:params}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" (%{NOTSPACE:params})?|- %{NUMBER:http_status_code} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{NUMBER:time_duration:float} %{NUMBER:time_backend_response:float}"
      ]
    }
    kv {
      prefix => "params."
      field_split => "&"
      source => "params"
    }
    urldecode {
         all_fields => true
    }
    date {
        locale => "en"
        match => ["timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]
    }
 
}

output部分
這里就是很簡(jiǎn)單往es中發(fā)送數(shù)據(jù)

?
1
2
3
4
5
6
7
8
9
10
output {
    elasticsearch {
        embedded => false
        protocol => "http"
        host => "localhost"
        port => "9200"
        user => "yejianfeng"
        password => "yejianfeng"
    }
}

這里有個(gè)user和password,其實(shí)elasticsearch加上shield就可以強(qiáng)制使用用戶名密碼登錄了。這里的output就是配置這個(gè)使用的。

查詢elasticsearch

比如上面的例子,我要查詢某段時(shí)間的params.source(其實(shí)是source參數(shù),但是前面的params是前綴)調(diào)用情況

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$url = 'http://xx.xx.xx.xx:9200/logstash-*/_search';
$filter = '
{
 "query": {
    "range" : {
      "@timestamp" : {
        "gt" : 123213213213,
        "lt" : 123213213213
      }
    }
  },
  "aggs" : {
    "group_by_source" : {"terms" : {"field" : "params.source"}}
  },
  "size": 0
}';

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲一区 日韩精品 中文字幕 | 国产精品爱久久久久久久 | 国产精久久久 | 国产精品久久久久久久久久久天堂 | 国产看片网站 | 天天射天天干 | av片免费看 | 久久久国产一区 | 天天操导航 | 国产一区二区三区久久久 | 老妇60一区二区三区 | 亚洲九九 | 久久久久久综合 | 亚洲性人人天天夜夜摸 | 亚洲www视频 | 欧美成人影院 | 日韩一区中文字幕 | 国产精品影视 | 久久久精品国产亚洲 | 亚洲精品乱码久久久久膏 | 欧美国产精品一区二区三区 | 免费精品视频 | 成人av免费观看 | 欧美日韩精品一区 | 9191国产视频| 国产精品丝袜视频 | 国产一级片免费观看 | 日韩欧美一区二区精品 | 黄色影院 | 人人草人人干 | 黄色片网站 | 精品在线播放 | 久久爱综合 | 人人爽视频| 国产一区精品在线 | 成人午夜精品久久久久久久网站 | 亚洲精品无 | 日本不卡高字幕在线2019 | 亚洲精品字幕 | 久久久久久高清 | 亚洲国产成人91精品 |