Docker流利的记录驱动程序用于多行

时间:2015-09-21 02:30:34

标签: logging docker fluentd

我正在尝试使用流利的Docker环境创建一个集中式日志记录系统。目前,我能够使用流畅的docker日志驱动程序将docker日志发送到流畅的日志驱动程序,与使用in_tail方法读取docker日志文件相比,这是一个更清晰的解决方案。但是,我目前正面临多行日志问题。

enter image description here

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

感谢。

CW

3 个答案:

答案 0 :(得分:3)

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

在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,其中每行开头,并在下面注明日期和时间戳(注意"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 Link, for reference

答案 1 :(得分:1)

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

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

来自其文档的常见Java堆栈跟踪示例:

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>.*)/

答案 2 :(得分:0)

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

添加

支持JSON
    json {
        source => "log_message"
        target => "json"
    }
解析日志行后

到他的过滤器

我从来没有找到一个流利的解决方案,所以改为使用这个解决方案

更新了链接