【问题标题】:Grok failing on bracketsGrok 在括号上失败
【发布时间】:2017-01-15 19:49:01
【问题描述】:

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

【问题讨论】:

  • 请使用Tour,阅读How To Ask并创建MCVE
  • 我在 Kibana 中得到一个“tags:_grokparsefailure”。 Logstash 没有正确解析它。

标签: regex logstash logstash-grok grok


【解决方案1】:

你在那个配置上吃了不少苦头。

首先,先尝试提取系统日志内容。每条线都是通用的,因此很容易匹配和脱离线,只留下更独特的东西由其他模式解析。换句话说,不要执行“date A|date B|date C”,而是提取日期,然后查找 A、B、C。针对短正则表达式运行的较短字符串应该更好。

接下来,想象一下您尝试使用的底层正则表达式是什么样的。我远离“|”除了非常小的模式(“开|关”类型的东西)。我没有测量性能,但我更喜欢看到它写出来:

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

要开始回答您真正的问题,正则表达式中的括号用于显示字符类,例如“[a-z]”。要告诉 grok 你的意思是一个字面括号,你只需要转义左括号,例如"\foo]" (因为右括号由于不与左括号配对而失去了它的魔力)。为了便于阅读,应该可以同时转义,例如 "\[foo\]"。

您的示例包含 6 个模式,您将这些模式应用于每个输入行。 grokparsefailure 只告诉您它们都不匹配。要找出原因,请查看您希望匹配的单个模式。如果错误不明显,请将模式和输入行带到 grok 调试器。切掉图案的第二半,看看它是否匹配。重复直到找到中断的部分。

在您的情况下,只是将模式粘贴到调试器中让我想知道为什么当输入中没有出现模式时您在模式周围加上括号。去掉那些(以及最后的星号),我认为它匹配。

【讨论】:

  • 感谢您的建议。很多东西可以在这里尝试
【解决方案2】:

好的,我想通了。这与我如何转义括号无关。我使用保留字'type'作为变量。

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2018-03-30
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多