Получить список зарегистрированных пользователей Log4J во время выполнения
Можно ли получить список всех добавлений, настроенных в log4j во время выполнения?
Я расскажу о сценарии немного больше. Учитывая следующую конфигурацию, как бы получить все приложения (stdout и altstdout)?
log4j.rootLogger=error, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.altstdout=org.apache.log4j.ConsoleAppender
log4j.appender.altstdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.altstdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
Ответы
Ответ 1
Если вам нужен доступ ко всем приложениям, настроенным для всех регистраторов, вы должны сделать что-то вроде этого
for (Enumeration loggers=LogManager.getCurrentLoggers(); loggers.hasMoreElements(); ) {
Logger logger = (Logger) loggers.nextElement();
for (Enumeration appenders=logger.getAllAppenders(); appenders.hasMoreElements(); ) {
Appender appender = (Appender) appenders.nextElement();
...
Я не знаю, почему у log4j нет метода, такого как LogManager.getAllAppenders(), но он выглядит как
недостаток.
Ответ 2
Это то, что вам нужно
log4j Метод getAllAppenders
Ответ 3
Я хочу добавить что-то, что мне понадобилось, чтобы понять.
Если вы посмотрите на рисунок ниже (который я скопировал из здесь), вы можете видеть, что хотя регистратор com.foo.bar
будет печатать на корневых регистраторах FileAppender, его список приложений по-прежнему равен нулю. Таким образом, вы не можете получить все приложения, к которым записывает журнал, с помощью метода logger.getAllAppenders()
.
![введите описание изображения здесь]()
Для этого вам необходимо выполнить итерацию всех родителей и корневого регистратора отдельно. Поскольку вы не можете перебирать logger.getParent()
в корневой журнал (корневой журнал возвращает null - см. Документацию getParent()). Насколько мне известно, вам нужно получить доступ к приложению rootLoggers отдельно через Logger.getRootLogger().getAllAppenders().