我正在尝试使用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,这是否意味着服务器代码有问题?
如果我有任何遗漏,请让我知道。