Подтвердить что ты не робот

Получить список зарегистрированных пользователей 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
4b9b3361

Ответ 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(), но он выглядит как недостаток.

Ответ 3

Я хочу добавить что-то, что мне понадобилось, чтобы понять. Если вы посмотрите на рисунок ниже (который я скопировал из здесь), вы можете видеть, что хотя регистратор com.foo.bar будет печатать на корневых регистраторах FileAppender, его список приложений по-прежнему равен нулю. Таким образом, вы не можете получить все приложения, к которым записывает журнал, с помощью метода logger.getAllAppenders().

введите описание изображения здесь

Для этого вам необходимо выполнить итерацию всех родителей и корневого регистратора отдельно. Поскольку вы не можете перебирать logger.getParent() в корневой журнал (корневой журнал возвращает null - см. Документацию getParent()). Насколько мне известно, вам нужно получить доступ к приложению rootLoggers отдельно через Logger.getRootLogger().getAllAppenders().