мы можем изменить уровень регистрации log4j во время выполнения - PullRequest
14 голосов
/ 11 декабря 2010

У меня проблема, я хочу изменить уровень ведения журнала log4j во время выполнения, я пробовал много вещей с файлом log4j.properties, я также пытался написать код, который после определенного времени снова читает файл свойств и снованастроить регистратор.

но проблема в том, что я хочу изменить уровень ведения журнала на DEBUG для одного вызова API, а затем, когда этот вызов завершится, регистратор должен снова перейти на предыдущее значение.

пожалуйста помогите ..

Ответы [ 5 ]

19 голосов
/ 11 декабря 2010

Вызов метода Logger.setLevel с желаемым Level может изменить уровень вывода Logger во время выполнения.

Ниже приведенопример, который демонстрирует его использование:

Logger logger = Logger.getLogger("myLogger");
logger.addAppender(new ConsoleAppender(new SimpleLayout()));

System.out.println("*** The current level will be INFO");

logger.setLevel(Level.INFO);
logger.warn("Only INFO and higher will appear");
logger.info("Only INFO and higher will appear");
logger.debug("Only INFO and higher will appear");

System.out.println("*** Changing level to DEBUG");

// remember the previous level
Level previousLevel = logger.getLevel();

logger.setLevel(Level.DEBUG);
logger.warn("DEBUG and higher will appear");
logger.info("DEBUG and higher will appear");
logger.debug("DEBUG and higher will appear");

System.out.println("*** Changing level back to previous level");

// revert to previous level
logger.setLevel(previousLevel);
logger.warn("Only INFO and higher will appear");
logger.info("Only INFO and higher will appear");
logger.debug("Only INFO and higher will appear");

Вышеприведенные выводы:

*** The current level will be INFO
WARN - Only INFO and higher will appear
INFO - Only INFO and higher will appear
*** Changing level to DEBUG
WARN - DEBUG and higher will appear
INFO - DEBUG and higher will appear
DEBUG - DEBUG and higher will appear
*** Changing level back to previous level
WARN - Only INFO and higher will appear
INFO - Only INFO and higher will appear

Выше показано, как изменить уровень одного Logger с именем myLogger, но если уровниИз всех регистраторов в текущем репозитории следует изменить, затем следует вызвать метод setLevel в корневом логгере , полученный с помощью Logger.getRootLogger, чтобы изменить уровни для всех дочерних элементов.регистраторы.

9 голосов
/ 11 декабря 2010

Уровень журнала в логгере можно изменить, вызвав setLevel, как описано в @coobird.Однако есть ловушка!

Когда вы вызываете getLogger(name), библиотека журналов вернет вам существующий объект Logger, если это возможно.Если два или более потоков запрашивают логгер с одинаковым именем, они получат один и тот же объект.Если один из потоков вызывает setLevel, это изменит уровень ведения журнала для всех остальных.Это может привести к неожиданному поведению.

Если вам действительно нужно делать такие вещи, лучшим подходом было бы создание регистратора с другим именем для случая, когда вы хотите вести журнал на другом уровне.

Однако я не убежден в целесообразности приложения, вызывающего setLevel.Метод setLevel предназначен для фильтрации сообщений журнала, и вы не должны отвлекать контроль фильтрации журналов от пользователя / развертывателя.

1 голос
/ 30 марта 2012

Я думаю, что имеет смысл вызвать setLevel, если на сервере есть поток «Контроллер».Таким образом, вы можете динамически изменять уровень ведения журнала во время выполнения, чтобы отладить проблему, и вернуть ее обратно, когда закончите.

Но я не знаю, что происходит, когда он вызывается из отдельного потока.

0 голосов
/ 01 февраля 2017
0 голосов
/ 07 декабря 2015

Метод setLevel существует только для java.util.logging.Logger, но не для org.apache.logging.log4j.Logger

Так мы устанавливаем уровень журнала в apache log4j

org.apache.logging.log4j.core.LoggerContext
ctx = (LoggerContext) LogManager.getContext(false);
org.apache.logging.log4j.core.config.Configuration
conf = ctx.getConfiguration();
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG);
ctx.updateLoggers(conf);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...