Мы можем изменить уровень ведения журнала log4j во время выполнения
У меня проблема, я хочу изменить уровень ведения журнала log4j во время выполнения, я пробовал много вещей с файлом log4j.properties, я также попытался написать код, который после определенного времени снова считывает файл свойств и снова настроить регистратор.
но проблема в том, что я хочу изменить уровень ведения журнала на DEBUG для одного вызова API, а затем, когда этот вызов будет завершен, регистратор должен снова измениться на предыдущее значение.
пожалуйста, помогите..
Ответы
Ответ 1
Вызов метода 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
необходимо вызвать, чтобы изменить уровни на всех дочерних регистраторах.
Ответ 2
Уровень журнала регистратора можно изменить, вызвав setLevel
, как описано в @coobird. Однако есть улов!
Когда вы вызываете getLogger(name)
, библиотека регистрации будет возвращать вам существующий объект Logger
, если это возможно. Если два или более потока запросят логгер с тем же именем, они получат один и тот же объект. Если один из потоков вызывает setLevel
, это изменит уровень регистратора для всех остальных. Это может привести к неожиданному поведению.
Если вам действительно нужно это делать, лучшим подходом было бы создание регистратора с другим именем для случая, когда вы хотите регистрироваться на другом уровне.
Однако я не уверен в мудрости приложения, вызывающего setLevel
вообще. Метод setLevel
предназначен для фильтрации сообщений журнала, и вы не должны пытаться контролировать фильтрацию протоколирования от пользователя/развертывателя.
Ответ 3
Я думаю, что имеет смысл вызывать setLevel
, если на сервере есть поток "Controller". Таким образом, вы можете динамически изменять уровень ведения журнала во время выполнения, чтобы отладить проблему и изменить ее, когда вы закончите.
Но я не знаю, что происходит, когда он вызывается из отдельного потока.
Ответ 4
Если вы используете Spring Boot (1.5+), вы можете использовать конечную точку logger для POST желаемого уровня ведения журнала.
Ответ 5
setLevel метод существует только для java.util.logging.Logger, а не для org.apache.logging.log4j.Logger
Таким образом, мы устанавливаем уровень log в 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);