12

我正在尝试使用 fluentd 为 docker 环境创建一个集中式日志记录系统。目前,我可以使用 fluentd docker logging 驱动程序将 docker 日志发送到 fluentd,与使用 in_tail 方法读取 docker 日志文件相比,这是一种更简洁的解决方案。但是,我目前正面临多行日志问题。

在此处输入图像描述

从上图中可以看出,多行日志是乱序的,这对用户来说非常混乱。有什么办法可以解决这个问题吗?

谢谢。

连续波

4

3 回答 3

3

使用 fluent-plugin-concat 插件帮助我解决了上述问题。

在 fluent-conf 中添加这些行

 <filter **>
  @type concat
  key log
  stream_identity_key container_id
  multiline_start_regexp /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}
  multiline_end_regexp /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}
</filter>

我的正则表达式正在检查日志中的 DateTimeStamp,其中每行以下面的 Date 和 Timestamp 开头(注意"log":"2017-09-21 15:03:27.289

2017-09-21T15:03:27Z    tag     {"container_id":"11b0d89723b9c812be65233adbc51a71507bee04e494134258b7af13f089087f","container_name":"/bel_osc.1.bc1k2z6lke1d7djeq5s28xjyl","source":"stdout","log":"2017-09-21 15:03:27.289  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.6"}
2017-09-21T15:03:28Z    tag     {"container_id":"11b0d89723b9c812be65233adbc51a71507bee04e494134258b7af13f089087f","container_name":"/bel_osc.1.bc1k2z6lke1d7djeq5s28xjyl","source":"stdout","log":"2017-09-21 15:03:28.191  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext"}

另外,我必须在 Dockerfile 中添加以下行来安装插件

RUN ["gem", "install", "fluent-plugin-concat", "--version", "2.1.0"] 
#Works with Fluentd v0.14-debian

虽然这个正则表达式在异常发生时不能很好地工作,但还是比以前好很多。 Fluentd 链接,供参考

于 2017-09-19T10:44:25.697 回答
1

看看multiline他们的文档中的解析:http: //docs.fluentd.org/articles/parser-plugin-overview#

您基本上必须指定一个匹配新日志消息开头的正则表达式,这将使 fluentd 能够将多行日志事件聚合到单个消息中。

他们的文档中常见的 java stacktrace 示例:

format multiline format_firstline /\d{4}-\d{1,2}-\d{1,2}/ format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\] (?<level>[^\s]+)(?<message>.*)/

于 2015-11-10T12:43:43.613 回答
0

我知道这不是流利问题的“答案”。但是本指南解决了logstash的问题: http ://www.labouisse.com/how-to/2015/09/14/elk-and-docker-1-8

通过添加 JSON 支持

    json {
        source => "log_message"
        target => "json"
    }

解析日志行后到他的过滤器

我从来没有找到 fluentd 的解决方案,所以改用这个解决方案

更新链接

于 2016-02-09T09:28:37.257 回答