Log4J2:如何在TCPSocketServer实现中将应用程序名称从客户端传递到服务器

时间:2017-06-08 20:36:49

标签: sockets logging log4j log4j2

我在群集中的边缘节点上运行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>

1 个答案:

答案 0 :(得分:0)

我使用ThreadContext来解决此问题。很容易将Thread Context添加到代码库中,然后使用Routing根据ThreadContext隔离日志事件。我按照此链接上的示例执行相同的https://logging.apache.org/log4j/2.x/faq.html#separate_log_files