【问题标题】:Socket Server - How can I get the name of the client in Log4j2.xml?Socket Server - 如何在 Log4j2.xml 中获取客户端的名称?
【发布时间】:2016-10-10 16:35:14
【问题描述】:

我设置了一个套接字服务器来接收来自多台机器和多个 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>  

【问题讨论】:

  • 定义“客户名称”。
  • @EJP 在发件人的主机名中。

标签: java xml sockets logging log4j2


【解决方案1】:

在默认配置中,SocketAppender 不包含发送者的主机名。但是,您可以通过以下方式轻松做到这一点:

<Logger name="com.acme" level="debug" additivity="false">
  <Property name="hostName">$${hostName}</Property>
  <AppenderRef ref="socket"/>
</Logger>

【讨论】:

  • 完美,谢谢!但是如何在 Socket 服务器的配置中检索一个属性呢?是否在线程上下文映射中?
  • -- 更新:没关系!它确实在上下文映射中,我只是语法错误。应该是 $${ctx:hostName},或者任何属性名称。
猜你喜欢
  • 2012-08-02
  • 2012-09-30
  • 2018-12-01
  • 2012-12-13
  • 2016-03-04
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多