亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

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

2024-08-30 12:28:05
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了用ELK來分析Nginx服務器日志的方法,ELK是三個開源軟件的縮寫,分別表示Elasticsearch,Logstash,Kibana,需要的朋友可以參考下
 

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

logstash

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

 

復制代碼代碼如下:

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}|-)"

 

 

 

由于是測試環境,我這里使用logstash讀取nginx日志文件的方式來獲取nginx的日志,并且僅讀取了nginx的access log,對于error log沒有關心。

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

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解析日志的思路為通過正則表達式來匹配日志,并將字段保存到相應的變量中。logstash中使用grok插件來解析日志,grok中message部分為對應的grok語法,并不完全等價于正則表達式的語法,在其中增加了變量信息。

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

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

可以通過這里來驗證grok表達式的語法是否正確,編寫grok表達式的時候可以在這里編寫和測試。

對于elasticsearch部分不做過多介紹,網上容易找到資料。


elk收集分析nginx access日志

使用redis的push和pop做隊列,然后有個logstash_indexer來從隊列中pop數據分析插入elasticsearch。這樣做的好處是可擴展,logstash_agent只需要收集log進入隊列即可,比較可能會有瓶頸的log分析使用logstash_indexer來做,而這個logstash_indexer又是可以水平擴展的,我可以在單獨的機器上跑多個indexer來進行日志分析存儲。

好了,現在進一步配置了。

nginx中的日志存儲格式

nginx由于有get請求,也有post請求,get請求的參數是會直接顯示在日志的url中的,但是post請求的參數呢,卻不會在access日志中體現出來。那么我想要post的參數也進行存儲紀錄下來。就需要自己定義一個log格式了。

 

復制代碼代碼如下:

 

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請求的body了,然后GET請求的參數在requestbody里面存放的就是POST請求的body了,然后GET請求的參數在request里面。具體怎么分析,我們在indexer中再想。

 

這里的server_addr存放的是當前web機器的IP,存這個IP是為了分析日志的時候可以分析日志的原始來源。

下面是一個GET請求的例子:

 

復制代碼代碼如下:

 

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

 


下面是一個POST請求的例子:

 

 

復制代碼代碼如下:

 

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

 


順便說下,這里知識在nginx.conf中定義了一個日志格式,還要記得在具體的服務中加入日志存儲。比如

 

listen    80;server_name api.yejianfeng.com;access_log /mnt/logs/api.yejianfeng.com.logstash.log logstash;

log_agent的配置

這個配置就是往redis隊列中塞入日志就行。output的位置設置為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的配置就比較麻煩了,需要配置的有三個部分

input: 負責從redis中獲取日志數據
filter: 負責對日志數據進行分析和結構化
output: 負責將結構化的數據存儲進入elasticsearch
input部分

input {    redis {        host => "10.173.xx.xx"        port => 8001        password => pass        data_type => "list"        key => "logstash:redis"    }}

其中的redis配置當然要和agent的一致了。

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

 

復制代碼代碼如下:

 

%{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}

 


這里使用了一點小技巧,params的使用,為了讓GET和POST的參數都反映在一個參數上,在對應的GET和POST的參數的地方,都設計使用params這個參數進行對應。

 

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

kv {  prefix => "params."  field_split => "&"  source => "params"}

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

urldecode {  all_fields => true}

看起來沒事了,但是實際上在運行的時候,你會發現一個問題,就是存儲到elasticsearch中的timestamp和請求日志中的請求時間不一樣。原因是es中的請求日志使用的是日志結構存放進入es的時間,而不是timestamp的時間,這里想要吧es中的時間和請求日志中的時間統一怎么辦呢?使用date命令。具體設置如下:

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

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

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部分
這里就是很簡單往es中發送數據

output {    elasticsearch {        embedded => false        protocol => "http"        host => "localhost"        port => "9200"        user => "yejianfeng"        password => "yejianfeng"    }}

這里有個user和password,其實elasticsearch加上shield就可以強制使用用戶名密碼登錄了。這里的output就是配置這個使用的。

查詢elasticsearch

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

$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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人午夜影院| 欧美俄罗斯性视频| 亚洲精品一区二区三区婷婷月| 午夜精品久久久久久久久久久久久| 美女视频久久黄| 久久综合久久美利坚合众国| 欧美一区二粉嫩精品国产一线天| 欧美日韩成人网| 日本久久久久久久| 久久夜色精品亚洲噜噜国产mv| 亚洲老板91色精品久久| 欧美日韩国产丝袜另类| 91久热免费在线视频| 欧美成人在线影院| 亚洲欧美国产视频| 日韩中文字幕在线视频播放| 久久国产精品久久久久久久久久| 久久夜色精品国产| 黑人巨大精品欧美一区二区免费| 久久久久久久久久久亚洲| 日韩中文字幕欧美| 狠狠色狠狠色综合日日小说| 欧美性猛交xxxx免费看| 日韩欧美a级成人黄色| 精品视频偷偷看在线观看| 大伊人狠狠躁夜夜躁av一区| 欧美日韩国产精品一区二区三区四区| 国产一区二区三区三区在线观看| 国产亚洲欧洲高清一区| 大胆欧美人体视频| 欧美极品少妇xxxxⅹ裸体艺术| 久久99久久99精品免观看粉嫩| 亚洲成色www8888| 亚洲天堂色网站| 欧美又大又硬又粗bbbbb| 国产精品视频1区| 亚洲丁香婷深爱综合| 中文字幕在线精品| 日韩网站免费观看高清| 欧美激情在线观看| 亚洲男人天堂网站| 亚洲电影天堂av| 久久久久久久久久久免费精品| 欧美精品18videos性欧美| 91久久久久久久| 欧美激情视频三区| 欧美电影免费观看大全| 成人午夜两性视频| 欧美日韩激情网| 高跟丝袜欧美一区| 日本最新高清不卡中文字幕| 亚洲视频在线看| y97精品国产97久久久久久| 中文字幕亚洲激情| 精品国产一区二区三区久久狼5月| 欧美老女人xx| 国产成人在线播放| 成人免费福利视频| 久久精品中文字幕电影| 日韩精品极品在线观看播放免费视频| 国产精品一区二区久久久久| 国产日韩欧美在线| 欧美香蕉大胸在线视频观看| 成人在线视频网站| 色偷偷亚洲男人天堂| 欧美成人国产va精品日本一级| 日韩暖暖在线视频| 久久男人资源视频| 亚洲一区美女视频在线观看免费| 成人高h视频在线| 亚洲国产欧美一区二区丝袜黑人| 亚洲伦理中文字幕| 国产亚洲视频在线| 欧美日韩国产区| 亚洲一区二区三区xxx视频| 日韩精品极品视频免费观看| 亚洲男子天堂网| 久久6免费高清热精品| 精品无人区太爽高潮在线播放| 日韩欧美一区二区三区久久| 久久男人的天堂| 欧美激情高清视频| 自拍偷拍亚洲区| 国产精品女人久久久久久| 热99久久精品| 亚洲深夜福利视频| 日韩有码在线播放| 久久久久久有精品国产| 亚洲成色777777在线观看影院| 欧美国产日产韩国视频| 96国产粉嫩美女| 97国产精品人人爽人人做| 精品亚洲一区二区三区在线观看| 亚洲国产精品字幕| 成人妇女淫片aaaa视频| 91在线视频免费| 韩国精品久久久999| 亚洲精品一区二区在线| 亚洲图片在线综合| 亚洲乱码国产乱码精品精| 国产一区二区三区久久精品| 日本高清+成人网在线观看| 亚洲级视频在线观看免费1级| 欧美日本国产在线| 亚洲女人天堂网| 国产精品午夜一区二区欲梦| 亚洲精品久久久久中文字幕二区| 亚洲精品久久久久久久久久久| 色偷偷噜噜噜亚洲男人| 亚洲欧美在线免费观看| 欧美电影免费看| 美女国内精品自产拍在线播放| 亚洲精品国产拍免费91在线| 国产精品日本精品| 操人视频在线观看欧美| 欧美激情第99页| 欧美日韩成人免费| 久久久久中文字幕| 欧美日韩美女在线观看| 国产精品高清在线| 91高清在线免费观看| 色综合视频网站| 久久全国免费视频| 欧美—级高清免费播放| 亚洲视频精品在线| 91亚洲永久免费精品| 久久国产精品久久久久久| 欧美高清无遮挡| 成人免费大片黄在线播放| 国产精品1区2区在线观看| 亚洲精美色品网站| 国产精品ⅴa在线观看h| 亚洲欧美日韩高清| 久久视频在线免费观看| 久久久国产一区二区| 亚洲一区二区福利| 高跟丝袜欧美一区| 欧美国产日韩一区二区在线观看| 久久久久久久久久久久av| 福利一区福利二区微拍刺激| 国产精品高精视频免费| 九色91av视频| 色99之美女主播在线视频| 91av在线播放| 成人信息集中地欧美| 欧美丰满少妇xxxx| 亚洲免费高清视频| 国产精品免费视频xxxx| 成人黄色大片在线免费观看| 欧美激情网友自拍| 国内精品久久久久久影视8| 91深夜福利视频| 91探花福利精品国产自产在线| 日韩精品在线第一页| 欧美国产极速在线| 欧美激情在线有限公司| 欧美黑人巨大xxx极品| 91精品国产91久久久久| 91免费看片网站| 国产91精品网站| 国产精品综合不卡av| 国产z一区二区三区| 精品亚洲国产成av人片传媒| 在线日韩中文字幕|