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

时间:2016-05-12 12:35:37

标签: java logging docker jvm graylog

我使用graylog作为中央日志记录服务器,并且我使用gelf log4j2-appender将日志消息发送到graylog。这很好用。现在我创建了我的应用程序的docker镜像,并且我能够将我的软件作为docker容器运行。

使用docker我也会登录到stdout(console-appender)以将应用程序日志导入docker(docker logs {containerId})。

现在我问自己,我可以在gelf log4j2-appender上使用,而是使用docker日志驱动程序/插件来支持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的各种方式的优缺点是什么?

1 个答案:

答案 0 :(得分:5)

我建议将现有的GELF appender用于您正在使用的日志框架(例如logstash-gelf),而不是将所有内容记录到stdout并使用Docker的GELF日志记录驱动程序。

使用具有本机Java日志记录框架的正确GELF appender,您可以使用MDC等高级功能,使用有价值的结构化信息丰富日志消息,而无需在服务器上接收消息后重新解析这些消息侧。使用Docker GELF日志记录驱动程序,您只能接收每行的日志消息,尤其是Java应用程序可能很难处理(想想多行堆栈跟踪)。

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