我设置了一个套接字服务器,用于接收来自多台计算机和多个Web应用程序的日志事件。如何检索发送每个事件的客户端名称(最好是XML配置)?或者我完全偏离了在此框架中分离日志的最佳实践?
预期结果:具有Log4j2路由追加器的套接字服务器,可以识别入站日志事件的客户端名称,并相应地将其路由到相应的文件。
结果我得到:没有路由器,它会冗余地将所有日志事件写入所有文件。使用路由器,由于我不知道正确的查找,因此不会将任何事件记录到任何文件中。
一个客户端配置的修改版本:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Appenders>
<Socket
name="Socket"
host="log4j-srv"
port="1234"
>
<SerializedLayout />
</Socket>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="Socket"/>
</Root>
</Loggers>
</Configuration>
服务器:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
<Appenders>
<Routing name="Routing">
<Routes pattern="???">
<Route>
<RollingRandomAccessFile name="Default"
fileName="example1.log"
example-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="${hostName} %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
</Route>
<Route key="client1">
<RollingRandomAccessFile name="Client1"
fileName="otherexample.log"
filePattern="otherexample-%d{yyyy-MM-dd}.log">
<PatternLayout pattern="${hostName} %d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Routing"/>
</Root>
</Loggers>
</Configuration>
答案 0 :(得分:2)
在默认配置中,SocketAppender不包含发件人的主机名。但是,您可以通过执行以下操作轻松完成此操作:
<Logger name="com.acme" level="debug" additivity="false">
<Property name="hostName">$${hostName}</Property>
<AppenderRef ref="socket"/>
</Logger>