如何在运行于Docker容器中的JVM应用程序中将日志发送到Graylog的最佳实践是什么?

8
我正在使用Graylog作为中央日志服务器,并使用gelf log4j2-appender将日志消息发送到Graylog。这很好用。现在,我创建了一个应用程序的Docker镜像,并且可以将软件作为Docker容器运行。
使用Docker,我还记录stdout(console-appender)以将应用程序日志记录到Docker中(docker logs {containerId})。
现在,我想知道是否可以省略gelf log4j2-appender,而是使用gelf的Docker日志驱动程序/插件。(请参见https://docs.docker.com/engine/admin/logging/overview/这里的最佳实践是什么? 我认为使用docker日志插件会将整个字符串消息发送到graylog,而graylog需要从该字符串中提取元信息(因此我需要在日志消息中提供此元数据,例如日志级别)。这可能会导致graylog端的资源消耗更多,并且无法配置docker仅将错误消息发送到graylog。这会导致更多的网络流量。使用log4j2 gelf-appender,我可以提供一些附加的元数据,而不将其包含在主日志消息中,并且在graylog端不需要提取。还可以通过日志级别配置应将哪些消息发送到graylog。或者我错了吗?什么是最佳解决方案,每种发送日志到graylog的方式的利弊是什么?
1个回答

7
我建议您使用现有的GELF appender来记录框架中的日志(例如logstash-gelf),而不是将所有内容记录到stdout并使用Docker的GELF日志驱动程序。使用本地Java日志框架的适当GELF appender可以使您使用高级功能,例如MDC,以丰富您的日志消息,并在服务器端接收这些消息后无需重新解析它们即可获得有价值的结构化信息。使用Docker GELF日志驱动程序,您只能逐行接收日志消息,特别是对于Java应用程序,这可能会很麻烦(考虑多行堆栈跟踪)。大多数日志框架都支持静态字段,因此您可以“注入”Docker容器的ID等信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接