_grokparsefailure on matching grok debugger pattern
我在获取logstash来识别我的模式时遇到了一些问题,该模式似乎与Grok调试器(https://grokdebug.herokuapp.com/)相匹配。
这与另一个StackOverflow问题(logstash _grokparsefailure问题)中发现的问题类似,但不幸的是,那里的解决方案似乎不起作用。
这些是我要匹配的日志:
1 2 3 | Mon Jan 25 11:12:12.890 [conn44141] authenticate db: admin { authenticate: 1, user:"person", nonce:"f00000000f", key:"a0000000000e" } "2015-01-25 14:46:31" id=Admin id=Admin,ou=user,dc=gooogle-wa,dc=com a000000a 100.00.00.01 INFO dc=gooooogle-wa,dc=com "cn=user,ou=AME Users,dc=goooogle,dc=com" BARF-4 aO.access "Not Available" 100.00.00.01 |
我用来解析这些的模式分别是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | if [type] =="openam" { if [file] =~"access" { grok{ match => [ 'message', '"%{TIMESTAMP_ISO8601:timestamp}"(\\s*)(%{QUOTEDSTRING:data_}|%{DATA:data_})(\\s*)(%{QUOTEDSTRING:LoginID}|%{DATA:LoginID})(\\s*)%{DATA:ContextID}(\\s*)("%{DATA:IP}"|%{IP:IP})(\\s*)?%{LOGLEVEL:loglevel}(\\s*)%{DATA:Domain}(\\s*)"%{DATA:LoggedBy}"(\\s*)(?<messageID>[a-zA-Z0-9._-]+)(\\s*)(%{DATA:ModuleName})(\\s*)"%{DATA:NameID}"(\\s*)(%{IP:hostname}|%{GREEDYDATA:hostname}) ' ] add_tag =>"openam_access" } } else if [file] =~"error" { grok{ match => ['message', '"%{TIMESTAMP_ISO8601:timestamp}"(\\s*)(%{QUOTEDSTRING:data_}|%{DATA:data_}) (\\s*)(%{QUOTEDSTRING:LoginID}|%{DATA:LoginID}) (\\s*)%{DATA:ContextID}(\\s*)("%{DATA:IP}"|%{IP:IP})(\\s*)?%{LOGLEVEL:loglevel}(\\s*)%{DATA:Domain}(\\s*)"%{DATA:LoggedBy}"(\\s*)(?<messageID>[a-zA-Z0-9._-]+)(\\s*)(%{DATA:ModuleName})(\\s*)"%{DATA:NameID}"(\\s*)(%{IP:hostname}|%{GREEDYDATA:hostname})', ] add_tag =>"openam_error" } } } if [type] =="mongo" { grok { match => [ "message","(?m)%{GREEDYDATA} \\[conn%{NUMBER:mongoConnection}\\] %{WORD:mongoCommand} %{WORD:mongoDatabase}.%{NOTSPACE:mongoCollection} %{WORD}: \\{ %{GREEDYDATA:mongoStatement} \\} %{GREEDYDATA} %{NUMBER:mongoElapsedTime:int}ms", "message","%{DATA:DayOfWeek} %{SYSLOGTIMESTAMP:timestamp} %{DATA:Thread} %{GREEDYDATA:msg} %{IP:ip}:%{NUMBER:port} ?#?%{NUMBER:ID}? %{GREEDYDATA:connections}", 'message', '%{DATA:DayOfWeek} %{SYSLOGTIMESTAMP:timestamp} %{DATA:Thread} %{DATA:msg}: %{WORD:userType} \\{ authenticate: %{NUMBER:authenticate}, user: %{QS:user}, nonce: %{QS:nonce}, key: %{QS:key} \\}' ] add_tag =>"mongodb" } |
} ??
您可以检查,这些模式在调试器上可以正常工作,但是由于某些原因,在我的kibana仪表板上,它们会显示_grokparsefailure标记。我怀疑这与我转义字符或使用
谢谢
您的模式似乎很好,但使用
1 2 3 4 5 6 7 8 | filter { grok { ... } grok { ... } } |
您要将两个模式都应用于所有输入字符串,并且与第一个模式匹配的输入字符串将永远不会与第二个模式匹配,反之亦然。因此,您始终会获得_grokparsefailure标记。
改为执行此操作:
1 2 3 4 5 6 | filter { grok { match => ['message', 'pattern1', 'message', 'pattern2'] } } |
如果您确实需要使用其他grok过滤器,请在消息的隐秘峰值条件下包含它们:
1 2 3 4 5 6 7 8 | filter { if [message] =~ /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) / { grok { match => ['message', 'pattern1'] } } ... } |
这显然会比较慢,这意味着您将需要维护更多的正则表达式。
我知道了。似乎还有另一个错误正在阻止我的logstash conf更新。强烈建议类似地点的任何人使用./logstash --configtest。