从Docker容器中运行的JVM应用程序发送日志到graylog的最佳实践是什么?
我使用graylog作为中央日志记录服务器,我使用gelf log4j2-appender将日志消息发送给graylog。这工作正常。现在我创建了我的应用程序的码头图像,并且能够将我的软件作为码头容器运行。从Docker容器中运行的JVM应用程序发送日志到graylog的最佳实践是什么?
使用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日志插件会将整个字符串消息发送到graylog,并且graylog需要从该字符串中提取元信息(所以我需要在日志消息中提供此元数据,例如log_level)。这可能会导致更多的资源消耗在graylog端,也不可能配置泊坞窗只发送错误消息到graylog。这导致更多的网络流量。使用log4j2 gelf-appender,我可以在日志消息中提供一些额外的元数据,而不会将其包含在主日志消息中,并且在graylog一侧不需要提取。也可以配置哪些消息应该通过log_level发送给graylog。还是我错了?什么是最好的解决方案,或者每种向graylog发送日志的方式有哪些优缺点?
我建议使用现有的GELF appender作为您正在使用的日志框架(例如logstash-gelf)而不是将所有内容记录到标准输出并使用Docker的GELF日志记录驱动程序。
使用适当的GELF appender与本机Java日志记录框架相结合,可以使用高级功能(如MDC)来丰富具有有价值结构化信息的日志消息,而无需在服务器端接收这些消息后重新解析这些消息。使用Docker GELF日志记录驱动程序,您只能接收每行一行的日志消息,尤其是使用Java应用程序的日志消息可能会令人头疼(想想多行堆栈跟踪)。
大多数日志记录框架都支持静态字段,因此您可以“注入”Docker容器的ID。