Log4j2 Socket appender для удаленной регистрации - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь вести удаленную регистрацию с помощью 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. Означает ли это, что с кодом сервера что-то не так?

Пожалуйста, дайте мне знать, если я что-то упустил.

...