我正在使用 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
根据你的使用情况进行修复,要么(正如我所怀疑的)直接删除它。