我有一个现有的分布式应用程序,它使用log4j将日志写入本地服务器。我希望保留现有功能,并将其中一些日志发送到中央存储库。我见过使用log4j和SocketAppender将日志发送到远程服务器的示例,但还没有看到多个服务器发送到同一远程服务器的示例,将每个服务器的日志写在单独的文件中。有这样的例子吗?
作为另一种选择,我对使用JDBCAppender作为集中式日志存储库感到好奇,但我也有一个相同的问题,即在查看查询结果时如何区分消息来自何处。是否有标识可在监听程序服务器上解释的发送方的log4j属性设置?
发布于 2017-08-27 21:59:19
对于您的第一个问题-它将取决于您的客户端程序向其发送日志的远程服务器。如果你已经开发了一些程序来接收远程服务器上的日志,那么有两种方法可以为每个客户端日志创建单独的日志文件-
如果您的服务器基于linux,我建议您使用来集中收集日志。在rsyslog中,您可以单独配置每个客户端,并将日志转储到单独的日志文件中。
第二个问题的 -您可以使用log4j的Nested diagnostic Context (NDC)特性在数据库中编写hostname。请参见this示例。这个示例使用USER_ID作为额外的列,用于在数据库中写入。类似地,您可以使用这个额外的列来编写hostname。在编写任何日志语句之前,在启动客户端程序时,您必须使用以下代码将值放入NDC中-
NDC.push(InetAddress.getLocalHost().getHostName()); 发布于 2018-05-02 17:09:46
您必须在配置文件中进行一些更改。考虑到多个应用程序想要将它们的日志文件写入中央远程位置,如果是,那么下面提到的更改将有所帮助:您需要在每个单独应用程序的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>https://stackoverflow.com/questions/45889454
复制相似问题