【问题标题】:how to combine multiline docker log into one fluentd event如何将多行 docker log 组合成一个 fluentd 事件
【发布时间】: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,但是安装这个插件有问题

最近没找到方法

【问题讨论】:

    标签: docker fluentd


    【解决方案1】:

    我的答案是安装多行解析器插件并启用 ruby​​ 添加'\n'

    <filter server.**>
      type record_transformer
      enable_ruby
      <record>
        log ${record["log"]+"\n"}
      </record>
    </filter>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多