log4j:如何使用SocketAppender?

20
我在stackoverflow上找到了有关如何使用SocketAppender(我需要从分布式系统中收集日志)的答案,但我对log4j很陌生,不知道如何使用示例代码。
可能我应该创建类似于以下内容的log4j-server.properties文件:
log4j.appender.SERVER=org.apache.log4j.net.SocketAppender
log4j.appender.SA.Port=4712
log4j.appender.SA.RemoteHost=loghost
log4j.appender.SA.ReconnectionDelay=10000

但是我仍然不知道如何启动服务器(如何使用此命令)

org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties

最重要的是: 在哪里/如何查看我的日志?


这些被称为命令行参数。 - Woot4Moo
请注意,您不应该在某些log4j版本中使用该功能(“这影响Log4j版本1.2至1.2.17”):https://nvd.nist.gov/vuln/detail/CVE-2019-17571 - metters
2个回答

46

您可以使用以下方式运行服务器

java -classpath log4j.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties

SimpleSocketServer是一个接收远程SocketAppender发送到指定端口号的日志事件,并按照您在log4j-server.properties文件中提供的配置将它们记录下来,就好像这些事件是在本地生成的一样。您需要像直接在原始进程中进行日志记录一样,配置相关控制台/文件/滚动文件附加器并将其附加到相关记录器。换言之,如果您当前正在使用以下内容创建本地日志文件:

log4j.rootLogger=DEBUG, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logfile.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d] [%t] [%m]%n

那么您需要更改发送端的log4j.properties,使其简单地表示如下:

log4j.rootLogger=DEBUG, server
log4j.appender.server=org.apache.log4j.net.SocketAppender
log4j.appender.server.Port=4712
log4j.appender.server.RemoteHost=loghost
log4j.appender.server.ReconnectionDelay=10000

服务器端的log4j-server.properties文件包含了之前在发送端定义的内容:

log4j.rootLogger=DEBUG, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=logfile.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d] [%t] [%m]%n

特别说明的是,在发送端在SocketAppender上指定布局没有意义 - 通过网络传输的是整个日志事件对象,接收端负责进行布局。

非常感谢,它起作用了 :) 但我还有一个问题。现在我得到了额外的日志,如 [2012-08-01 15:20:39,950] [main] [Connected to client at /127.0.0.1] [2012-08-01 15:20:39,950] [main] [Starting new socket node.] [2012-08-01 15:20:39,950] [main] [Waiting to accept a new client.] 我应该怎么做才能避免记录这个? - alicjasalamon
1
这些看起来像是套接字服务器本身生成的消息。您需要稍微调整一下日志记录配置。根据这些额外消息的级别,将服务器端根记录器设置为ERROR可能已经足够了,然后添加log4j.logger.com.example=DEBUG或适用于发送方正在记录的记录器。 - Ian Roberts
支持Log4J 2怎么样? - Donatello
服务器能否识别客户端,例如将不同的客户端分配到不同的文件中,或者为每个日志事件添加客户端IP? - Leon
@Leon 这不是标准做法,但 SimpleSocketServer 的代码非常简单,所以很容易修改它,在本地记录事件之前将客户端的 IP 地址添加到 MDC 中,然后您可以在 appender 模式中引用该 MDC 键。 - Ian Roberts

0

在命令提示符中输入以下命令即可启动服务器:

java -classpath C:Users.m2repositorylog4jlog4j1.2.17log4j-1.2.17.jar org.apache.log4j.net.SimpleSocketServer 4712 log4j-server.properties

请不要忘记在系统中指定正确的log4j.jar路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接