8

我使用 graylog 作为中央日志服务器,我使用 gelf log4j2-appender 将日志消息发送到 graylog。这工作正常。现在我创建了我的应用程序的 docker 映像,我可以将我的软件作为 docker 容器运行。

使用 docker 我还登录到标准输出(console-appender)以将应用程序日志输入到 docker(docker logs {containerId})。

现在我问自己是否可以在 gelf log4j2-appender 上备用,而使用 docker log-driver/plugin 代替 gelf。(见https://docs.docker.com/engine/admin/logging/overview/

这里的最佳做法是什么?我认为使用 docker log 插件会将整个字符串消息发送到 graylog,而 graylog 需要从该字符串中提取元信息(因此我需要在日志消息中提供此元数据,例如 log_level)。这可能会导致 graylog 端消耗更多资源,并且也无法将 docker 配置为仅向 graylog 发送错误消息。这会导致更多的网络流量。使用 log4j2 gelf-appender,我可以在日志消息之外提供一些元数据,而无需将其包含在主日志消息中,并且在 graylog 端不需要提取。也可以通过 log_level 配置应该将哪些消息发送到 graylog。还是我错了?最好的解决方案是什么,或者将日志发送到 graylog 的每种方式的优缺点是什么?

4

1 回答 1

7

我建议对您正在使用的日志框架(例如logstash-gelf)使用现有的 GELF 附加程序,而不是将所有内容都记录到标准输出并使用 Docker 的 GELF 日志驱动程序。

将适当的 GELF appender 与本机 Java 日志记录框架一起使用,您可以使用MDC等高级功能来丰富您的日志消息,其中包含有价值的结构化信息,而无需在服务器端接收到这些消息后重新解析这些消息。使用 Docker GELF 日志记录驱动程序,您只能逐行接收日志消息,尤其是对于 Java 应用程序,处理起来可能会令人头疼(想想多行堆栈跟踪)。

大多数日志框架都支持静态字段,因此您可以“注入”例如 Docker 容器的 ID。

于 2016-05-12T13:02:10.003 回答