log4j:Socket Appender如何工作?

我不确定Socket Appender是如何工作的。 我知道记录事件被发送到特定端口。 然后我们可以在控制台上打印日志或将其放入文件中。

我的问题更多的是关于日志的发送方式。 有没有例如一个队列? 是同步还是异步? 可以使用它减慢我的程序?

我在这里找到了一些信息,但对我来说并不清楚。

从SocketAppender文档

日志TCP实现自动缓冲日志记录事件。 这意味着如果到服务器的链接速度慢但仍然快于客户端生成(日志)事件的速率,则客户端将不会受到慢速网络连接的影响。 但是,如果网络连接速度低于事件生成速率,则客户端只能以网络速率进行。 特别是,如果到服务器的网络链接已关闭,则将阻止客户端。

另一方面,如果网络链接已启动,但服务器已关闭,则在发出日志请求时不会阻止客户端,但由于服务器不可用,日志事件将丢失。

由于appender使用TCP协议,我会说日志事件是“同步的”。

基本上,appender使用TCP将第一个日志事件发送到服务器。 但是,如果网络延迟太高以至于在生成第二个事件时仍未发送消息,则第二个日志事件将不得不等待(从而阻塞),直到第一个事件被消耗。 所以是的,如果应用程序生成的日志事件比网络传递的速度快,那么它会降低应用程序的速度。

正如@Akhil和@Nikita所提到的,如果您不希望应用程序的性能受到网络延迟的影响,那么JMSAppender或AsyncAppender将是更好的选择。

Socket Appender将日志作为序列化的Obect发送到SocketNode或日志服务器。 在appender中,具有已配置的reconnectionDelay的连接器线程将检查连接完整性,并在未初始化或断开连接时转储所有日志。对应用程序流没有阻塞。 如果在通过JVM发送日志信息时需要更好的JMSfunction,请尝试使用JMSAppender 。

  1. Log4j JMS appender可用于将日志消息发送到JMS代理。事件被序列化并作为JMS消息类型ObjectMessage传输。

你可以在这里获得一个示例程序。

它似乎是同步的(检查来源)但我可能是错的。 您可以使用AsyncAppender使其exception。 看到这个 。