- ELK stack權威指南
- 饒琛琳
- 537字
- 2018-12-31 21:08:13
3.2 Nginx錯誤日志
Nginx錯誤日志是運維人員最常見但又極其容易忽略的日志類型之一。本節介紹對Nginx錯誤日志的處理方式,并推薦讀者在性能優化中對此多加關注。Nginx錯誤日志既沒有統一明確的分隔符,也沒有特別方便的正則模式,但通過Logstash不同插件的組合,還是可以輕松進行數據處理的。
值得注意的是,Nginx錯誤日志中有一類數據是接收過大請求體時的報錯,默認信息會把請求體的具體字節數記錄下來。每次請求的字節數基本都是在變化的,這意味著常用的topN等聚合函數對該字段沒有明顯效果。所以,對此需要做一下特殊處理。
最后形成的Logstash配置如下所示:
filter { grok { match => { “message” =>“(?<datetime>\d\d\d\d/\d\d/\d\d \d\d:\d\d:\d\d) \[(?<errtype>\w+)\] \S+: \*\d+ (?<errmsg>[^,]+), (?<errinfo>.*)$” } } mutate { rename => [ “host”, “fromhost” ] gsub => [ “errmsg”, “too large body: \d+ bytes”, “too large body” ] } if [errinfo] { ruby { code =>“event.append(Hash[event['errinfo'].split(‘, ’)。map{|l| l.split (‘: ’)}])” } } grok { match => { “request” => ‘“%{WORD:verb} %{URIPATH:urlpath}(?:\?%{NGX_ URIPARAM:urlparam})?(?: HTTP/%{NUMBER:httpversion})”' } patterns_dir =>“/etc/logstash/patterns” remove_field => [ “message”, “errinfo”, “request” ] } }
經過以上Logstash配置的Nginx錯誤日志生成的事件如下所示:
{“@version”: “1”,“@timestamp”: “2015-07-02T01:26:40.000Z”,“type”: “nginx-error”,“errtype”: “error”,“errmsg”: “client intended to send too large body”,“fromhost”: “web033.mweibo.yf.sinanode.com”,“client”: “36.16.7.17”,“server”: “api.v5.weibo.cn”,“host”: “\”api.weibo.cn\“”,“verb”: “POST”,“urlpath”: “/2/client/addlog_batch”,“urlparam”: “gsid=_2A254UNaSDeTxGeRI7FMX9CrEyj2IHXVZRG1arDV6PUJbrdANLROskWp9b XakjUZM5792FW9A5S9EU4jxqQ&wm=3333_2001&i=0c6f156&b=1&from=1053093010&c= iphone&v_p=21&skin=default&v_f=1&s=8f14e573&lang=zh_CN&ua=iPhone7,1__weibo__ 5.3.0__iphone__os8.3”,“httpversion”: “1.1” }