希望有人可以帮助我,因为这个问题使我困惑了好几天。
我正在使用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
并收到像
{container_id:xxx, container_name:xxx, log:xxx, ...}
例如,java异常堆栈跟踪将如下所示:
{log:exampleException:error, ...}
{log:\tat java.xxx, ...}
{log:\tat java.xxx, ...}
现在我的问题是:如何将它们组合在一起?就像logtash中的multline。
我期望的正确答案是:
{log:exampleException:error\n\tat java.xxx\n\tat java.xxx, ...}
我的流利输入是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,但是在安装该插件时遇到了问题
最近我没有找到任何方法
最佳答案
我的答案是安装multiline-parser插件并启用ruby添加'\ n'
<filter server.**>
type record_transformer
enable_ruby
<record>
log ${record["log"]+"\n"}
</record>
</filter>
关于docker - 如何将多行 docker 日志组合成一个流畅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37828765/