我有一个使用log4j的现有分布式应用程序将日志写入本地服务器。我想保留现有功能,并将一些日志发送到中央存储库。我已经看到了使用log4j和SocketAppender将日志发送到远程服务器的示例,但是没有看到多个服务器发送到同一个远程服务器的示例,将每个服务器的日志单独写入文件。有这样的例子吗?
作为替代方案,我很好奇使用JDBCAppender使用数据库作为集中式日志存储库,但是在查看查询结果时如何区分消息的来源时遇到了同样的问题。是否有log4j属性设置,用于标识可在侦听器服务器上解释的发件人?
答案 0 :(得分:0)
对于您的第一个问题 - ,这取决于客户端程序向其发送日志的远程服务器。如果您已经开发了一些用于在远程服务器上接收日志的程序,则有两种方法可以为每个客户端日志创建单独的日志文件 -
服务器程序应该侦听特定端口,并在收到一些日志后,应检查客户端IP,然后为每个客户端IP创建日志文件。
使服务器程序在每个客户端的不同端口上侦听,并在客户端连接到其特定端口后,接收数据并转储到日志文件中。这种方法看似简单但不推荐。
如果您的服务器基于Linux,我建议您使用rsyslog来集中日志收集。在rsyslog
中,您可以单独配置每个客户端,并将日志转储到单独的日志文件中。
对于第二个问题 - ,您可以使用log4j的Nested diagnostic Context (NDC)
功能在数据库中编写hostname
。请参阅this示例。此示例使用USER_ID作为在数据库中写入的额外列。同样,您可以使用此额外列来编写hostname
。在编写任何日志语句之前启动客户端程序时,必须使用以下代码将值放在NDC
中 -
NDC.push(InetAddress.getLocalHost().getHostName());
答案 1 :(得分:0)
您必须在配置文件中进行一些更改。考虑到多个应用程序想要将其日志文件写入集中式远程位置,如果是,那么下面提到的更改将有所帮助: 您需要在每个应用程序的Log4j配置文件中进行更改。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<Property name="server-log-path">REMOTE_SERVER_PATH</Property>
</Properties>
<Appenders>
<File name="Login-App-File-Appender" fileName="${server-log-path}/file_name.log" >
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>
</PatternLayout>
</File>
<File name="CheckOut-App-File-Appender" fileName="${server-log-path}/file_name.log" >
<PatternLayout>
<pattern>
[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="com.microService.LoginService" level="info" additivity="false">
<AppenderRef ref="Login-App-File-Appender"/>
</Logger>
<Logger name="com.microService.CheckOutService" level="info" additivity="false">
<AppenderRef ref="CheckOut-App-File-Appender"/>
</Logger>
<Root>
<AppenderRef ref="Login-App-File-Appender"/>
</Root>
</Loggers>
</Configuration>