logback создать новый экземпляр приложения - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю с LogBack и у меня есть несколько Logger.Я создал пользовательское приложение:

public class LogListenerAppender extends AppenderBase<ILoggingEvent> {

    private List<LogListener> listeners;

    public LogListenerAppender() {
        listeners = new ArrayList<>();
    }

    public void addListener(LogListener listener){
        listeners.add(listener);
        System.out.println("Current listener: " + listeners.size());
    }

    /**
     * Send the LogEvent to all Listeners
     * @param eventObject the LogEventObject
     */
    @Override
    protected void append(ILoggingEvent eventObject) {
        for(LogListener listener : listeners){
            listener.receiveLogMessage(eventObject);
        }
    }
}

Это приложение позволяет добавить прослушиватели в Logger для перехвата сообщений журнала.

Теперь в моем файле logback.xml я создал приложение какLISTENER

<!--Custom Listener Appender-->
<appender name="LISTENER" class="path.to.LogListenerAppender"/>

И некоторые Logger:

<logger name="TestLogger">
    <appender-ref ref="LISTENER" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER" />
</logger>

В коде я добавляю LogListener к Logger:

public static void main(String[] args){
    Logger testLogger = LoggerFactory.getLogger("TestLogger");
    Logger mainLogger = LoggerFactory.getLogger("MainLogger");

    addListenerToLogger(testLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("TEST LOG: " + message);
        }
    });
    addListenerToLogger(mainLogger, new LogListener(Level.TRACE) {
        @Override
        public void log(String message, long timestamp) {
            System.out.println("MAIN LOG: " + message);
        }
    });
    testLogger.info("Hello");
}

private static void addListenerToLogger(Logger logger, LogListener loglistener){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender("LISTENER");
    appender.addListener(loglistener);
}

Желаемый вывод:

ЖУРНАЛ ТЕСТА: Здравствуйте

Но вывод:

ЖУРНАЛ ТЕСТА: Здравствуйте
ГЛАВНЫЙ ЖУРНАЛ: Здравствуйте

И System.out.println("Current listener: " + listeners.size()); в LogListenerAppender печатает2.

Моя проблема сейчас заключается в том, что Logback использует один и тот же экземпляр LogListenerAppender для всех Logger, который использует <appender-ref ref="LISTENER"/>.

Но мне нужен для каждого Logger новый LogListenerAppender.Как я могу настроить logBack, который он создает каждый раз при создании нового экземпляра?

Моя идея - создать appender для каждого регистратора, например:

<appender name="LISTENER1" class="path.to.LogListenerAppender"/>
<appender name="LISTENER2" class="path.to.LogListenerAppender"/>
//etc...
<logger name="TestLogger">
    <appender-ref ref="LISTENER1" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="LISTENER2" />
</logger>
//etc...

Но я надеюсь, что существует более простой способ

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете понять, почему это происходит в вашем коде, здесь:

LogListenerAppender appender = (LogListenerAppender) log.getAppender ("LISTENER");

Ваш код получает только тот, кто добавлен вами 'Создан в памяти с тегом "LISTENER".Все в этом списке слушателей будут прослушивать любое событие от аппендера, помеченного слушателем.

Возможно, попробуйте добавить строку в ваш метод добавления слушателя, например так:

private static void addListenerToLogger(Logger logger, LogListener loglistener, String appenderRef){
    ch.qos.logback.classic.Logger log = (ch.qos.logback.classic.Logger) logger;
    LogListenerAppender appender = (LogListenerAppender)log.getAppender(appenderRef);
    appender.addListener(loglistener);
}

Таким образом, вы можетепередайте соответствующую ссылку appender (т.е. "LISTENER1") методу для извлечения соответствующих appdenders.

Было бы также целесообразно выбрать соответствующие ссылки, например:

<logger name="TestLogger">
    <appender-ref ref="TEST" />
</logger>

<logger name="MainLogger">
    <appender-ref ref="MAIN" />
</logger>

удобочитаемости и удобства обслуживания, но это выбор стиля, а не техническое решение

...