java - 从在 docker 容器中运行的 JVM 应用程序将日志发送到 graylog 的最佳做法是什么?

标签 java logging docker jvm graylog

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

我还使用 docker 登录到 stdout (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 的每种方式的优缺点是什么?

最佳答案

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

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

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

关于java - 从在 docker 容器中运行的 JVM 应用程序将日志发送到 graylog 的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187081/

相关文章:

java - 是否有任何 Java API 可以在运行时使用输入的 xml 模式和 xpath 表达式和数据的键值对生成 xml

angularjs - Angular Analytics Splunk日志记录

shell - Docker compose 找不到 $PWD 环境变量

java - 当我运行 docker Run 时出现 Docker 容器错误

node.js - 在 kubernetes 中缓存

java - 如何从 if-else 语句创建/实例化对象?

java - 当在类上进行注释时,如何使注释在每个方法上都起作用,例如@ResponseBody

java - 如何在没有 labelmaps.txt 文件的情况下使用 Tensorflow lite 检测对象地标?

objective-c - 配置 log4Cocoa

linux - 使用 linux 过滤 apache 文件