我正在尝试为Apache日志错误过滤器定义配置logstash过滤器。它基本上是带有某些附加字段的“组合” LogFormat,这是Apache日志格式定义:
[[11446] [星期四1月30日07:50:49] [调试]:RT ::使用日期时间:: ParseDate做'2020-01-31T07:20:46Z'1580446800(/ app / rt4 / sbin /../ lib / RT / Date.pm:274)
或者它可能是这种格式:
[[Wed Jun 26 22:13:22 2013] [错误] [客户端10.10.10.100] PHP致命错误:未捕获的异常'\ Foo \ Bar'
我尝试了以下解决方案:
APACHE_ERROR_TIME%{DAY}%{MONTH}%{MONTHDAY}%{TIME}%{YEAR}APACHE_ERROR_LOG [%{APACHE_ERROR_TIME:timestamp}][%{LOGLEVEL:loglevel}](?:[客户端%{IPORHOST:clientip}]){0,1}%{GREEDYDATA:errormsg}
但是它给出一个grok_match_failure。
请为我上面的字符串提供一个通用工作模式(这意味着即使字符串的一部分不存在也没关系)
使用提供的APACHE_ERROR_TIME
,我得到了与该模式的匹配:
\[%{APACHE_ERROR_TIME:timestamp}\] \[%{LOGLEVEL:loglevel}\](?: \[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:errormsg}
除了转义方括号外,还有一些放错位置的空格阻止了比赛。
对于:
[11446] [Thu Jan 30 07:50:49 2020] [debug]: RT::Date used Time::ParseDate to make '2020-01-31T07:20:46Z' 1580446800 (/app/rt4/sbin/../lib/RT/Date.pm:274)
结果:
timestamp Thu Jan 30 07:50:49 2020
loglevel debug
clientip
errormsg : RT::Date used Time::ParseDate to make '2020-01-31T07:20:46Z' 1580446800 (/app/rt4/sbin/../lib/RT/Date.pm:274)
before match: [11446]
对于:
[Wed Jun 26 22:13:22 2013] [error] [client 10.10.10.100] PHP Fatal error: Uncaught exception '\Foo\Bar'
结果:
timestamp Wed Jun 26 22:13:22 2013
loglevel error
clientip 10.10.10.100
errormsg PHP Fatal error: Uncaught exception '\Foo\Bar'