如何用Logstash Grok模式解析自定义Nginx access.log?
针对Nginx main日志格式的Logstash Grok匹配方案
你的Nginx main日志格式对应的Grok匹配模式可以直接按字段对应编写,以下是完整实用方案:
1. 基础Grok匹配模式
直接对应日志格式的完整pattern:
%{IPORHOST:remote_addr} - %{DATA:remote_user} \[%{HTTPDATE:time_local}\] %{QS:request} %{NUMBER:status:int} %{NUMBER:body_bytes_sent:int} %{QS:http_referer} %{QS:http_user_agent} %{QS:http_x_forwarded_for}
2. 各字段匹配说明
%{IPORHOST:remote_addr}:匹配$remote_addr,兼容IP地址或主机名%{DATA:remote_user}:匹配$remote_user,支持日志中用-表示无用户的场景\[%{HTTPDATE:time_local}\]:匹配[$time_local],HTTPDATE是Grok内置的、专门适配Nginx时间格式(如10/Oct/2000:13:55:36 +0000)的模式%{QS:request}:匹配带引号的$request,QS是内置的带引号字符串匹配规则%{NUMBER:status:int}:匹配$status,指定类型为整数方便后续统计分析%{NUMBER:body_bytes_sent:int}:匹配$body_bytes_sent,指定类型为整数%{QS:http_referer}:匹配带引号的$http_referer%{QS:http_user_agent}:匹配带引号的$http_user_agent%{QS:http_x_forwarded_for}:匹配带引号的$http_x_forwarded_for
3. Logstash配置示例
在Logstash配置文件的filter模块中可以这样配置:
filter { grok { match => { "message" => "%{IPORHOST:remote_addr} - %{DATA:remote_user} \[%{HTTPDATE:time_local}\] %{QS:request} %{NUMBER:status:int} %{NUMBER:body_bytes_sent:int} %{QS:http_referer} %{QS:http_user_agent} %{QS:http_x_forwarded_for}" } } # 可选优化:将空用户标识(-)转为空值,移除原始message字段 mutate { gsub => [ "remote_user", "^-$", "" ] remove_field => [ "message" ] } # 可选优化:将日志时间转为Logstash标准时间字段 date { match => [ "time_local", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" } }
4. 进阶:拆分请求字段
如果需要把$request拆分为请求方法、路径、协议三个独立字段,可将%{QS:request}替换为:
"%{WORD:request_method} %{URIPATHPARAM:request_path} %{DATA:request_protocol}"
对应的完整pattern变为:
%{IPORHOST:remote_addr} - %{DATA:remote_user} \[%{HTTPDATE:time_local}\] "%{WORD:request_method} %{URIPATHPARAM:request_path} %{DATA:request_protocol}" %{NUMBER:status:int} %{NUMBER:body_bytes_sent:int} %{QS:http_referer} %{QS:http_user_agent} %{QS:http_x_forwarded_for}
内容的提问来源于stack exchange,提问作者Kosmylo
相关产品推荐
相关产品推荐

