用于远程日志记录的Log4j2套接字附加器

时间:2019-03-13 11:15:25

标签: sockets log4j2 appender

我正在尝试使用log4j2套接字附加程序进行远程日志记录。到目前为止,我已经能够将日志写入远程位置,但是当任何一个客户端关闭时,都会出现连续错误 在服务器上

2019-03-13 15:12:21,820 Log4j2-0 ERROR  java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:154)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at org.apache.logging.log4j.server.InputStreamLogEventBridge.logEvents(InputStreamLogEventBridge.java:61)
at org.apache.logging.log4j.server.TcpSocketServer$SocketHandler.run(TcpSocketServer.java:90)

即使服务器连续记录此错误,它仍然能够记录来自其他客户端的事件。以下是我的测试代码:

客户端log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
    <Socket name="socket" host="localhost" port="7001" immediateFlush="true" bufferSize="1024">
         <JsonLayout properties="true"/>
    </Socket>
</Appenders>
<Loggers>
    <AsyncLogger name="com.mysocketAppender.client" level="debug" additivity="false" >
        <AppenderRef ref="socket"/>
    </AsyncLogger>

    <Root level="debug">
        <AppenderRef ref="socket"/>
    </Root>
</Loggers>
</Configuration>

服务器log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
    <RollingFile name="myLogAppender" ignoreExceptions="false"  fileName="D:/mylogs/test.log"  filePattern="D:/mylogs/test.log-%i.log" >
      <PatternLayout pattern="%-23d{DEFAULT} | %-30.-30threadName | %-5level |  %-80c | %message | %xEx{full}\n"/>
        <Policies>
            <SizeBasedTriggeringPolicy size="10MB"/>
        </Policies>
        <DefaultRolloverStrategy max="100"/>
    </RollingFile>
</Appenders>
<Loggers>
    <AsyncLogger name="com.mysocketAppender.client" level="debug" additivity="true" >
        <AppenderRef ref="myLogAppender"/>
    </AsyncLogger>
    <Root level="debug">
        <AppenderRef ref="myLogAppender"/>
    </Root>
</Loggers>

用于创建TCPSocketServer的服务器代码

import org.apache.logging.log4j.server.JsonInputStreamLogEventBridge;
import org.apache.logging.log4j.server.TcpSocketServer;
import java.io.IOException;

public class SocketAppenderServerMainClass {

public static void main(String[] args) {
    TcpSocketServer server = null;
    try {
        server = new TcpSocketServer(7001,new JsonInputStreamLogEventBridge());
        System.out.println("Before server run.");
        server.run();
        System.out.println("After server run.");

  }
    catch (IOException e)
    {
        e.printStackTrace();
    }finally{
        try {
            server.shutdown();
        }catch (IOException e)
        {
            e.printStackTrace();
        }
    }
  }
}

使用过的瓶子 log4j-api-2.11 log4j-core-2.11 log4j-server-2.9

以下是我需要帮助的一些查询:

1)要阻止服务器进入“连接重置”错误状态。
2)上面的代码中的SocketAppenderServerMainClass始终打印“服务器运行之前”。但是“服务器运行后”。永远不会打印。
3)永远不会调用block。
4)在服务器关闭时,退出代码始终为1而不是0,这是否意味着服务器代码有问题?

如果我有任何遗漏,请让我知道。

0 个答案:

没有答案