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

我使用Graylog作为中央日志logging服务器,并使用gelf log4j2-appender将日志消息发送到graylog。 这工作正常。 现在我创build了我的应用程序的泊坞窗图像,我能够运行我的软件作为docker集装箱。

使用docker我也login到标准输出(控制台appender)获取应用程序日志到docker(docker logs {containerId})。

现在我问自己,我可以在gelf log4j2-appender上腾出空间,并使用docker log-driver / plugin作为gelf。 (请参阅https://docs.docker.com/engine/admin/logging/overview/ )

这里最好的做法是什么? 我认为使用docker日志插件会将整个string消息发送到graylog,并且graylog需要从该string中提取元信息(所以我需要在日志消息中提供这个元数据,例如log_level)。 这可能会导致更多的资源消耗在graylog端,也不可能configuration泊坞窗只发送错误消息到graylog。 这导致更多的networkingstream量。 使用log4j2 gelf-appender,我可以在日志消息中提供额外的元数据,而不需要将其包含在主日志消息中,并且在graylog端不需要提取。 也可以通过log_levelconfiguration哪些消息应该发送给graylog。 还是我错了? 什么是最好的解决scheme或每种方式发送日志到graylog的优点和缺点是什么?

我build议使用现有的GELF appender作为你正在使用的日志框架(例如logstash-gelf ),而不是logging一切到stdout并使用Docker的GELF日志logging驱动程序。

使用适当的GELF appender与本地Java日志logging框架,使您能够使用MDC等高级function来丰富您使用有价值的结构化信息的日志消息,而无需在服务器端接收这些消息后重新parsing这些消息。 使用Docker GELF日志logging驱动程序,您只能接收每行一行的日志消息,尤其是使用Java应用程序时,可能会很头疼(想想多行堆栈跟踪)。

大多数日志框架都支持静态字段,所以你可以“注入”你的Docker容器的ID。