Я работаю с 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...
Но я надеюсь, что существует более простой способ