在同一个文件中处理不同的日志格式

Handling different log formats in the same file

我有一个包含不同输出格式的日志文件。

例如:

line 1 = 2015-01-1 12:04:56 INFO 192.168.0.1 my_user someone logged in
line 2 = 2015-01-1 12:04:56 WARN [webserver-thread] (MyClass.java:66) user authenticated

虽然真正的解决方案是将它们拆分成单独的文件或统一格式,但是否可以使用 Logstash 理解不同的日志格式?

我的第一个建议是 运行 一个 grok{} 来去除常见的东西 - 日期时间和日志级别。你可以把剩下的东西放回[message]字段:

%{TIMESTAMP_ISO8601} %{WORD:level} %{GREEDYDATA:message}

确保在 grok{} 中使用 'overwrite' 参数。

然后,如果您想解析剩余的信息,您的(多个)正则表达式将运行宁对较短的字符串,这应该会使它们更有效。

然后您可以有多个模式:

grok {
    match => [
        "message", "PATTERN1",
        "message", "PATTERN2"
    ]
}

默认情况下,grok 会在遇到第一个匹配项时停止处理。