Nginx错误日志Grok模式解析失败,请求正确配置方案
解决Nginx日志Grok解析失败的问题
先看看你的目标日志行:
2018/05/11 23:08:28 [error] 53734#53734: *621532077 upstream prematurely closed connection while reading response header from upstream, client: 192.168.22.10, server: www.testserver.pt, request: "GET /methods/userinfo.ashx/getUserOpenBetsData? HTTP/2.0", upstream: "https://188.11.2.3:443/methods/userinfo.ashx/getUserOpenBetsData?", host: "www.testserver.pt", referrer: "https://www.testserver.pt/"
你的现有Grok模式有几个小问题导致解析失败,我帮你一一修正:
问题分析
F_TIMESTAMP不是内置模式:Logstash没有默认的F_TIMESTAMP模式,直接用%{DATA:timestamp}就可以,你的date插件已经配置了正确的时间格式解析规则,完全能处理这个格式。- 进程ID部分的匹配可以更精准:日志里的
53734#53734是Nginx的进程ID#线程ID,用%{NUMBER:pid}#%{NUMBER:tid}替代%{DATA:EventId},能拆分出更有用的字段。 GREEDYDATA的范围问题:原模式里的%{GREEDYDATA:Message}会一直匹配到日志末尾,把后面的client:等内容也吞进去,改成%{DATA:Message}就能精准捕获到错误描述部分。
修正后的完整Logstash配置
input { beats { port => "5044" } } filter { grok{ match => { "message" => '%{DATA:timestamp} \[%{DATA:Message_type}\] %{NUMBER:pid}#%{NUMBER:tid}: \*%{NUMBER:Secondaryid} %{DATA:Message}, client: %{IP:origin}, server: %{URIHOST:domain}, request: "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}", upstream: %{QS:upstream}, host: %{QS:host}, referrer: %{QS:referrer}' } } date{ locale => "en" match => ["timestamp", "YYYY/MM/dd HH:mm:ss"] target => "@timestamp" } } output { elasticsearch { hosts => [ "localhost:9200" ] index => "logstash-%{+YYYY.MM.dd.HH}" user => "elastic" password => "changeme" } }
额外优化建议
- 如果你想更精确地控制时间戳匹配,可以把
%{DATA:timestamp}换成%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME:timestamp},不过你的现有date配置已经足够,没必要额外拆分。 - 可以用Grok调试工具(本地或在线版本)来测试你的模式,快速验证匹配效果。
内容的提问来源于stack exchange,提问作者ricardo gaspar
相关产品推荐
相关产品推荐

