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

Мы можем изменить уровень ведения журнала log4j во время выполнения

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

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

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

4b9b3361

Ответ 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". Таким образом, вы можете динамически изменять уровень ведения журнала во время выполнения, чтобы отладить проблему и изменить ее, когда вы закончите.

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

Ответ 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);