I am building an admin UI for managing logback loggers level and changing appenders. I know I can find all appenders that are added to some logger with the following code:
private Map<String, Appender<ILoggingEvent>> getAppendersMap() {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
Map<String, Appender<ILoggingEvent>> appendersMap = new HashMap<>();
for (Logger logger : loggerContext.getLoggerList()) {
Iterator<Appender<ILoggingEvent>> appenderIterator = logger.iteratorForAppenders();
while (appenderIterator.hasNext()) {
Appender<ILoggingEvent> appender = appenderIterator.next();
if (!appendersMap.containsKey(appender.getName())) {
appendersMap.put(appender.getName(), appender);
}
}
}
return appendersMap;
}
The problem is if I have this logback.xml as example:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="10 minutes">
<appender name="writeToConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%date{yyyy-MM-dd;HH:mm:ss.SSS} %-11p: %40.40c: %X{tablist}%m %n
</pattern>
</encoder>
</appender>
<appender name="NOPAppender" class="ch.qos.logback.core.helpers.NOPAppender" />
<root>
<level value="INFO"/>
<appender-ref ref="writeToConsole"/>
</root>
</configuration>
the NOPAppender is not a attached to any logger and therefor the method getAppendersMap() doesn't find it.