docker - 如何将多行 docker 日志组合成一个流畅事件

标签 docker fluentd

希望有人可以帮助我,因为这个问题使我困惑了好几天。

我正在使用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/

相关文章:

python - gevent uwsgi 插件未在 Alpine docker 中加载

elasticsearch - 流利的日志充满了反斜杠,并且kibana没有显示k8s pod日志

sockets - fluentd aws kinesis插件没有将记录放入kinesis

spring - FluentD 无法在 Elasticsearch 中写入日志

Java 日志的正则表达式模式

python - 在 docker-py 中发布到随机端口并返回端口

docker - 如何使用 helm 图表将 docker 容器端口绑定(bind)到主机

elasticsearch - 使用Fluentd运送到Elasticsearch后,日志未按顺序显示

Docker Compose 如何通过构建扩展服务以使用图像代替

docker - RabbitMQ、.NET Core 和 Kubernetes(配置)