我在群集中的边缘节点上运行Log4J2 TCPSocketServer。所有数据节点都将日志事件发送到边缘节点上的TCPSocketServer,并使用log4j2.xml配置文件在数据节点中本地记录,如下所示。应用程序名称存储为系统属性,可以使用$ {sys:ABC.appname}在数据节点或客户端的log4j2.xml配置中访问。如何使用log4j2.xml将相同的appname发送到运行TCPSocketServer的边缘节点。我将在log4j2-server.xml中使用相同的Application Name将事件记录到单独的日志文件中,就像我在数据节点上进行本地操作一样。
数据节点或客户端的示例代码段 - log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" >
<Appenders>
<Socket name="socket" host="localhost" port="12345" >
<SerializedLayout />
</Socket>
<File name="MyFile" fileName="/var/log/${sys:ABC.appname}.log" >
<PatternLayout>
<Pattern>%d{ISO8601} %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="socket"/>
<AppenderRef ref="MyFile"/>
</Root>
</Loggers>
</Configuration>
来自边缘节点或服务器的示例代码段 - log4j2-server.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<File name="MyFile" fileName="/var/log/data/${hostName}-<**This is where I would like to see the appname from data node**>.log" >
<PatternLayout>
<Pattern>%d{ISO8601} %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
<Async name="AsyncFile">
<AppenderRef ref="MyFile" />
</Async>
</Appenders>
<Loggers>
<Root level="WARN">
<AppenderRef ref="AsyncFile"/>
</Root>
</Loggers>
</Configuration>
答案 0 :(得分:0)
我使用ThreadContext来解决此问题。很容易将Thread Context添加到代码库中,然后使用Routing根据ThreadContext隔离日志事件。我按照此链接上的示例执行相同的https://logging.apache.org/log4j/2.x/faq.html#separate_log_files