使用 logstash 解析 log4j 日志文件

使用 logstash 解析 log4j 日志文件

我正在使用 logstash 解析多行 log4j 日志,遇到了最奇怪的问题。

以下是一些相关日志条目的示例:

2016-01-05 13:55:26,275 调试 [类别] [线程] - bla
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaaa
2016-01-05 13:55:27,030 调试 [类别] [线程] - blaaaaaaa

这是我的 log4j 的 logstash 配置:

如果 [类型] == “log4j” {
    多行 {
        模式 => "(^%d{yyyy-MM-dd HH:mm:ss,SSS})"
        什么 => 上一个
        否定 => 真
    }
    格罗克 {
        匹配 => [“消息”,“%{TIMESTAMP_ISO8601:logdate}%{LOGLEVEL:loglevel}(?.*)”]
    }
    日期 {
        匹配 => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]
        时区 => “欧洲/巴黎”
    }
}

结果很好;没有 grok 解析错误,日期很好,日志级别很好,但是消息内容重复:

2016-01-05 13:55:26,275 调试 [类别] [线程] - bla
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaaa
2016-01-05 13:55:27,030 调试 [类别] [线程] - blaaaaaaa
[类别] [主题] - bla
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaa
2016-01-05 13:55:26,275 调试 [类别] [线程] - blaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaa
2016-01-05 13:55:26,282 调试 [类别] [线程] - blaaaaaa
2016-01-05 13:55:27,030 调试 [类别] [线程] - blaaaaaaa

并且重复内容的第一行缺少时间戳和日志级别!

有人知道为什么会发生这种情况吗?

欢迎任何帮助。

编辑473183469 的评论之后

多行过滤器中的日期模式未按预期工作。

我修改了 logstash 的配置,只合并来自异常的行(就像 un the文档

如果 [类型] == “log4j” {
    多行 {
        模式 => “^\s”
        什么 => “上一个”
    }
    多行 {
        模式 => “^导致”
        什么 => “上一个”
    }
    格罗克 {
        匹配 => [“消息”,“%{TIMESTAMP_ISO8601:logdate}%{LOGLEVEL:loglevel}(?.*)”]
    }
    日期 {
        匹配 => ["logdate", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601"]
        时区 => “欧洲/巴黎”
    }
}

我刚刚添加了另一个多行过滤器,以防堆栈跟踪中出现“导致”行。

一切正常,只是消息内容以相同的方式重复!时间戳和日志级别再次丢失:

016-01-06 09:46:00,842 错误 [coyntry.org.web.LoaderListener] [Thread-6] - java.lang.RuntimeException:java.io.FileNotFoundException:文件(没有此文件或目录)
    在 coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
    在 coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
    在 coyntry.org.web.LoaderListener$LoaderThread.run(LoaderListener.java:74)
    在 java.lang.Thread.run(Thread.java:745)
原因:java.io.FileNotFoundException:文件(没有此文件或目录)
    在 java.io.FileInputStream.open (本机方法)
    在 java.io.FileInputStream。(FileInputStream.java:146)
    在 coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
[coyntry.org.web.LoaderListener] [Thread-6] - java.lang.RuntimeException:java.io.FileNotFoundException:文件(没有此文件或目录)
    ... 另外 3 个,
    在 coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:174)
    在 coyntry.org.web.WebProperties.getServiceLocator(WebProperties.java:156)
    在 coyntry.org.web.LoaderListener$LoaderThread.run(LoaderListener.java:74)
    在 java.lang.Thread.run(Thread.java:745)
原因:java.io.FileNotFoundException:文件(没有此文件或目录)
    在 java.io.FileInputStream.open (本机方法)
    在 java.io.FileInputStream。(FileInputStream.java:146)
    在 coyntry.org.web.WebProperties.getDatabaseProperties(WebProperties.java:168)
    ... 另外 3 个

我实在不明白发生了什么事。

答案1

您真的需要吗multiline

不是multiline用来将rsyslog分割后的单个日志重新连接在一起的吗?

典型的例子是java堆栈错误跟踪消息。

如果 rsyslog 在“\n”处拆分堆栈跟踪错误,我们将无法再理解任何内容,因此我们需要重新排列消息。

您的示例不同,因为每行日志看起来都与其他日志行独立。

简而言之:重复以及标题抑制都来自multiline。要么multiline根据你的使用情况进行修复,要么(正如我所怀疑的)直接删除它。

相关内容