Logback - Как получить экземпляр ListAppender - PullRequest
1 голос
/ 12 марта 2020

Я использую архитектуру клиент / сервер для ведения журнала с SocketAppender на клиенте и SimpleSocketServer на сервере.

Я хочу сохранить все журналы в списке Java для последующей обработки. Я думаю, что могу использовать ListAppender, у которого есть резервная коллекция List.

У меня работают приложения Console и Rolling, но я не знаю, как получить экземпляр ListAppender, чтобы получить доступ к журналам.

Файл конфигурации клиента

<?xml version="1.0" encoding="UTF-8" ?>

<!-- ==================================================================== -->
<!-- SocketAppender configuration file.                                   -->
<!-- ==================================================================== -->

<configuration>

  <appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
    <RemoteHost>127.0.0.1</RemoteHost>
    <Port>6000</Port>
    <ReconnectionDelay>5000</ReconnectionDelay>
    <IncludeCallerData>true</IncludeCallerData>
  </appender>

  <root level="debug">
    <appender-ref ref="SOCKET" />
  </root>  

</configuration>

Файл конфигурации сервера

<?xml version="1.0" encoding="UTF-8" ?>

<!-- ==================================================================== -->
<!-- This config file is intended to be used by a SocketServer that logs  -->
<!-- events received from various clients on the console and to a file    -->
<!-- that is rolled over when appropriate. The interesting point to note  -->
<!-- is that it is a configuration file like any other.                   -->   
<!-- ==================================================================== -->

<configuration>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%date %-5level [%thread] %logger - %message%n</Pattern>
    </layout>       

  </appender>

  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>rolling.log</File>

        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <FileNamePattern>rolling.%i.log</FileNamePattern>
            <MinIndex>1</MinIndex>
            <MaxIndex>3</MaxIndex>
        </rollingPolicy>

        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>8KB</MaxFileSize>
        </triggeringPolicy>

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%relative %-5level %logger - %message%n</Pattern>
    </layout>       
  </appender>

  <appender name="LIST"  class="ch.qos.logback.core.read.ListAppender"/>

  <root>
    <level value ="debug"/>
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="ROLLING" />
  </root>  
</configuration>

1 Ответ

0 голосов
/ 12 марта 2020

Чтобы использовать ListAppender, мне не хватало прикрепить его к root регистратору в файле xml на сервере. Проверьте тег root в конфигурационном файле сервера, приведенном ниже.

<?xml version="1.0" encoding="UTF-8" ?>

<!-- ==================================================================== -->
<!-- This config file is intended to be used by a SocketServer that logs  -->
<!-- events received from various clients on the console and to a file    -->
<!-- that is rolled over when appropriate. The interesting point to note  -->
<!-- is that it is a configuration file like any other.                   -->   
<!-- ==================================================================== -->

<configuration>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%date %-5level [%thread] %logger - %message%n</Pattern>
    </layout>       

  </appender>

  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <File>rolling.log</File>

        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <FileNamePattern>rolling.%i.log</FileNamePattern>
            <MinIndex>1</MinIndex>
            <MaxIndex>3</MaxIndex>
        </rollingPolicy>

        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>8KB</MaxFileSize>
        </triggeringPolicy>

    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>%relative %-5level %logger - %message%n</Pattern>
    </layout>       
  </appender>

  <appender name="LIST"  class="ch.qos.logback.core.read.ListAppender"/>

  <root>
    <level value ="debug"/>
<!--    <appender-ref ref="CONSOLE" />-->
<!--    <appender-ref ref="ROLLING" />-->
    <appender-ref ref="LIST" />
  </root>
</configuration>

После этого тривиально получить приложение списка в Java:

import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import org.slf4j.LoggerFactory;

Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) rootLogger.getAppender("LIST");
...