Я пытаюсь вести удаленную регистрацию с помощью log4j2 Socket appender. До сих пор я могу записывать журналы в удаленное местоположение, но когда один из клиентов выключен, возникает постоянная ошибка
на сервере
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-апи-2,11
log4j-ядро-2,11
log4j-сервер 2.9 * +1021 *
Вот некоторые из моих запросов, в которых мне нужна помощь:
1) Чтобы сервер не переходил в состояние ошибки «Сброс подключения».
2) SocketAppenderServerMainClass в приведенном выше коде всегда печатает «Перед запуском сервера». но "После запуска сервера." никогда не печатается.
3) Наконец, блок никогда не вызывается.
4) При выключении сервера код выхода всегда равен 1, а не 0. Означает ли это, что с кодом сервера что-то не так?
Пожалуйста, дайте мне знать, если я что-то упустил.