我在括号上遇到了一致的grok失败。我用'\'逃过了支架。我也试图用通配符欺骗它。 Grok调试器正确解析,但无法在生产中解析。我有两个其他条目表现出相同的行为,而其他没有括号的模式正在解析。
'%{WORD:type} [%{INT:pid}]'就是问题。
#Jan 15 13:35:44 firewall sshd[1468]: Accepted publickey for john from 192.168.1.16 port 62529 ssh2: .....
AUTHLOG1 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} %{WORD:type}\[%{INT:pid}\]: Accepted publickey for %{USERNAME:user} from %{IP:src_ip} port %{INT:port} %{WORD:protocol}*)
#Jan 15 13:35:44 firewall systemd-logind[1221]: New session 481 of user john.
AUTHLOG4 (%{SYSLOGTIMESTAMP:timestamp} %{WORD:src_host} (?<type>[a-z-]+)\[%{INT:pid}\]: Removed session %{INT:session}.)
AUTHLOG (?:%{AUTHLOG1}|%{AUTHLOG2}|%{AUTHLOG3}|%{AUTHLOG4}|%{AUTHLOG5}|%{AUTHLOG6})
if [type] == "authlog" {
grok {
match => { "message" => "%{AUTHLOG}"}
patterns_dir => ["/etc/logstash/grok"]
}
}
答案 0 :(得分:0)
你用这个配置咬了很多。
首先,尝试先取出系统日志。每条线都很常见,因此很容易匹配和拉出线,只留下更独特的东西来解析其他模式。换句话说,不要做“日期A |日期B |日期C”而是拉日期然后查找A,B,C。对短路正则表达式运行的较短字符串应该更好。
接下来,想象一下您尝试使用的底层正则表达式。我远离“|”除非是非常小的图案(“On | Off”类型的东西)。我没有测量过性能,但我更愿意看到它:
match => { message => [
"Pattern 1 %{WORD} ...",
"Pattern 2 %{WORD} ..."
]
}
要开始回答您的真实问题,正则表达式中的括号用于显示字符类,例如“[A-Z]”。要告诉grok你的意思是文字括号,你只需要逃避开括号,例如“\ foo]”(由于没有与开场式的brakcet配对,结束括号已经失去了它的魔力)。为了便于阅读,应该可以逃避它们,例如“\ [foo \]”。
您的示例包含您应用于每个输入行的6种模式。 grokparsefailure只告诉你没有一个匹配。要找出原因,请查看您希望匹配的单一模式。如果错误不明显,请将模式和输入行带到grok调试器。切掉图案的下半部分,看它是否匹配。重复,直到找到断裂的部分。
在你的情况下,只需将模式粘贴到调试器中就会让我想知道为什么在输入中没有出现的情况下你会在模式周围使用括号。拿出那些(和最后的星号),我认为它匹配。
答案 1 :(得分:0)
好的,我明白了。它与我如何转义括号无关。我使用了保留字&#39; type&#39;作为变量。