我试图设置一个GROK模式来捕获nginx错误日志,但是内容是可变的。例如,如果没有引荐来源网址,它只会将该值留在行尾:
2018/08/30 09:30:32 [error] 84843#0: *24414687217 open() "/www/sites/js/draw.js" failed (2: No such file or directory), client: 172.68.211.134, server: www.example.com, request: "GET /bundles/app/js/draw.js HTTP/1.1", host: "www.example.com"
但是如果有一个,它会添加:
, referrer: "https://www.example.com/de/member/foo"
我当前的GROK模式适用于带有引荐来源网址的行,但是如何处理两个示例?
%{DATA:nginx_error.time} \[%{DATA:nginx_error.level}\] %{NUMBER:nginx_error.pid}#%{NUMBER:nginx_error.tid}: (\*%{NUMBER:nginx_error.connection_id} )?%{GREEDYDATA:nginx_error.message}, client: %{IP:nginx_error.client}, server: %{HOSTNAME:nginx_error.server}, request: \"%{DATA:nginx_error.request}\", host: \"%{HOSTNAME:nginx_error.host}\", referrer: \"%{URI:nginx_error.referrer}\"
答案 0 :(得分:1)
您可以使用?
(例如(, referrer: )?(\"%{URI:referrer}\")?
请注意,括号(...)中包含的数据称为capturing group
。
您的模式将变成
%{DATA:nginx_error.time} \[%{DATA:nginx_error.level}\] %{NUMBER:nginx_error.pid}#%{NUMBER:nginx_error.tid}: (\*%{NUMBER:nginx_error.connection_id} )?%{GREEDYDATA:nginx_error.message}, client: %{IP:nginx_error.client}, server: %{HOSTNAME:nginx_error.server}, request: \"%{DATA:nginx_error.request}\", host: \"%{HOSTNAME:nginx_error.host}\"(, referrer: )?(\"%{URI:referrer}\")?