【发布时间】:2016-10-16 04:11:49
【问题描述】:
希望有人可以帮助我,因为这个问题困扰了我好几天......
我正在使用 fluentd 来集中 docker 容器的日志。所以我设置了 docker run 选项:
log-driver=fluentd
log-opt=fluentd-address=fluentd.marathon.mesos:24224
log-opt=tag=server
log-opt=fluentd-async-connect=true
并收到类似的json对象
{container_id:xxx, container_name:xxx, log:xxx, ...}
例如,java 异常堆栈跟踪将是这样的:
{log:exampleException:error, ...}
{log:\tat java.xxx, ...}
{log:\tat java.xxx, ...}
现在我的问题是:如何将它们组合在一起?就像 logstash 中的多行一样。
我期待的正确答案是:
{log:exampleException:error\n\tat java.xxx\n\tat java.xxx, ...}
我的fluentd输入是in_forward而不是in_tail,所以从文档中我不能使用fluentd核心内置的多行插件。
然后我找到了这个插件https://github.com/quick-sort/fluent-plugin-multiline-parser
但是因为我从 docker 收到的日志在每一行的末尾不包含 '\n',所以这个插件将我所有的日志合并成一行!
例如我用“例外”这个词来标记第一行,但我得到的答案是:
{log:Exception:error\tat java.xxx\tat java.xxx, ...}
它将我的 docker 日志视为单行,并用单词“Exception”分隔它们
我尝试通过过滤器record_transformer为每个日志添加一个'/n',但是过滤器将我的'\n'自动更改为'\\n',所以它也失败了
我也找到了一个插件https://github.com/okkez/fluent-plugin-concat,但是安装这个插件有问题
最近没找到方法
【问题讨论】: