重新启动 syslog 服务后,Log4j2 Syslog appender 不会将第一条消息写入 syslog

Log4j2 Syslog appender is not writing the 1st message to syslog after the syslog service is restarted

我们已经将我们的应用程序配置为使用 Log4j2 的 Syslog appender 将一些特定的日志消息写入系统的 Syslog 文件。将 Syslog 写入文件没有问题。但是当 syslog 服务重新启动时,第一条日志消息并没有写入 syslog。后面的留言都写好了。

启用Log4j调试日志,重启后写入第一条消息到syslog时未见异常。但是对于后续的请求,在Log4j2日志中抓到了如下信息。

2022-01-27 18:07:40,120 ajp-nio-0.0.0.0-8009-exec-3 DEBUG Reconnecting localhost/127.0.0.1:514
2022-01-27 18:07:40,121 ajp-nio-0.0.0.0-8009-exec-3 DEBUG Creating socket localhost/127.0.0.1:514
2022-01-27 18:07:40,122 ajp-nio-0.0.0.0-8009-exec-3 DEBUG Closing SocketOutputStream java.net.SocketOutputStream@1a769d7
2022-01-27 18:07:40,122 ajp-nio-0.0.0.0-8009-exec-3 DEBUG Connection to localhost:514 reestablished: Socket[addr=localhost/127.0.0.1,port=514,localport=57852]

我获取了 threaddump 并检查了 Reconnector 线程是否 运行 但 threaddump 中不存在这样的线程。我在这里一无所知,任何帮助找到丢失消息的原因都会有所帮助。

环境详情: CentOS 7.9 + RSyslog 服务, 应用程序部署在 Tomcat 和 运行 Java 11, Log4j2版本为2.17.1

这是由于纯文本 TCP 系统日志的工作方式所致。查看 this post 了解更多信息。

此“错误”自 8.1901 版及更新版本以来就存在。

据我所知,解决此问题的唯一方法是通过 RELP 协议发送消息。请参阅 omrelp 模块。