我正在尝试使用 fluentd 为 docker 环境创建一个集中式日志记录系统。目前,我能够使用 fluentd docker 日志驱动程序将 docker 日志发送到 fluentd,与使用 in_tail 方法读取 docker 日志文件相比,这是一个更清晰的解决方案。但是,我目前正面临多行日志问题。
从上图可以看出,多行日志是乱序的,这对用户来说非常困惑。有什么办法可以解决这个问题吗?
谢谢。
连续波
最佳答案
使用 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 的地方,其中每一行都以下面的日期和时间戳记(注意
"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。
关于logging - 用于多行的 Docker Fluentd 日志驱动程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32686502/