Grok在支架上失败



我在括号上遇到了一致的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"]
}
}

使用该配置会消耗很多。

首先,试着先取出syslog的内容。它对每一行都是通用的,所以很容易匹配和提取行,只留下更独特的东西供其他模式解析。换句话说,不要做"日期A|dateB|dateC",而是提取日期,然后查找A、B、C。针对缩短的正则表达式运行的字符串越短越好。

接下来,想象一下您尝试使用的底层regexp是什么样子的。我远离"|",除非是很小的模式("开|关"类型的东西)。我还没有衡量性能,但我更喜欢看到它被写下来:

match => { message => [
"Pattern 1 %{WORD} ...",
"Pattern 2 %{WORD} ..."
]
}

为了开始回答您的真实问题,正则表达式中的括号用于显示字符类,例如"[a-z]"。要告诉grok你指的是一个字面括号,你只需要转义开括号,例如"\foo]"(因为闭括号由于没有与开头的brakcet配对而失去了魔力)。为了可读性,应该可以同时转义,例如"\[foo\]"。

您的示例包含6个模式,这些模式将应用于每个输入行。grokparsefailure只是告诉你他们没有一个匹配。要找出原因,请查看您期望匹配的单一模式。如果错误不明显,那么将模式和输入行带到grok调试器。剪掉图案的下半部分,看看它是否匹配。重复此步骤,直到找到断裂的部分。

在您的情况下,仅仅将模式粘贴到调试器中就让我想知道,当输入中没有出现模式时,为什么在模式周围有括号。把这些去掉(还有末尾的星号),我认为它匹配。

好吧,我想通了。这与我如何逃脱括号无关。我使用了保留字"type"作为变量。

最新更新