Каковы различные подходы к динамическому изменению уровня журнала log4j, чтобы мне не пришлось повторно развертывать приложение. Будут ли изменения в этих случаях постоянными?
ОБРАТИТЕ ВНИМАНИЕ, что (почти) все на этой странице посвящено log4j, а не log4j2. Вся эта страница настолько полна путаницы и неверного направления, что БЕСПОЛЕЗНА. Перейдите на stackoverflow.com/questions/23434252/…, как рекомендует @slaadvak.
Lambart
Ответы:
86
Изменить уровень журнала очень просто; изменение других частей конфигурации приведет к более глубокому подходу.
LogManager.getRootLogger().setLevel(Level.DEBUG);
Изменения постоянны на протяжении всего жизненного цикла Logger. При повторной инициализации конфигурация будет считана и использована, поскольку установка уровня во время выполнения не сохраняет изменение уровня.
ОБНОВЛЕНИЕ: если вы используете Log4j 2, вы должны удалить вызовы в setLevelсоответствии с документацией, поскольку это может быть достигнуто с помощью классов реализации.
Вызовы logger.setLevel () или подобных методов не поддерживаются в API. Приложения должны удалить их. Эквивалентная функциональность предоставляется в классах реализации Log4j 2, но может сделать приложение уязвимым для изменений во внутреннем устройстве Log4j 2.
Только для зависимостей времени выполненияLogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
CelinHC
8
Обратите внимание, что API log4j 2 не предоставляет метод "setLevel".
ChrisCantrell
5
Но это только устанавливает корневой регистратор, не так ли? Если индивидуальные уровни установлены для регистраторов под root, установка корневого регистратора не повлияет на эти LOGGER. Разве нам не нужно делать что-то вроде root.getLoggerRepository (). GetCurrentCategories (), перебирать каждый экземпляр регистратора и устанавливать УРОВНИ для каждого регистратора? @AaronMcIver
Log4j2 можно настроить на обновление своей конфигурации путем сканирования файла log4j2.xml (или его эквивалента) через заданные интервалы. Например, <Configuration status = "warn" monitorInterval = "5" name = "tryItApp" packages = "">
Кимбалл Робинсон,
89
File Watchdog
Log4j может отслеживать log4j.xmlизменения конфигурации в файле. Если вы измените файл log4j, log4j автоматически обновит уровни журнала в соответствии с вашими изменениями. Подробности см. В документации org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long). По умолчанию время ожидания между проверками составляет 60 секунд. Эти изменения будут постоянными, поскольку вы напрямую меняете файл конфигурации в файловой системе. Все, что вам нужно сделать, это один раз вызвать DOMConfigurator.configureAndWatch ().
Внимание: метод configureAndWatch небезопасен для использования в средах J2EE из-за утечки потока
JMX
Другой способ установить уровень журнала (или перенастроить в целом) log4j - использовать JMX. Log4j регистрирует свои регистраторы как JMX MBeans. Используя консоли серверов приложений MBeanServer (или jconsole.exe JDK), вы можете перенастроить каждый отдельный регистратор. Эти изменения не являются постоянными и будут сброшены до конфигурации, установленной в файле конфигурации, после перезапуска приложения (сервера).
Ручной работы
Как описано Аароном, вы можете установить уровень журнала программно. Вы можете реализовать это в своем приложении так, как хотите. Например, у вас может быть графический интерфейс, в котором пользователь или администратор изменяет уровень журнала, а затем вызывает setLevel()методы в регистраторе. Сохраняете ли вы настройки где-нибудь или нет, решать вам.
Предостережение относительно подхода сторожевого таймера log4j: «Поскольку configureAndWatch запускает отдельный поток сторожевого таймера, и поскольку нет возможности остановить этот поток в log4j 1.2, метод configureAndWatch небезопасен для использования в средах J2EE, где повторно используются приложения». Ссылка: Log4J FAQ
Somu
Если бы мне пришлось использовать функцию configureAndWatch Log4j, я мог бы остановить этот сторожевой поток в методе EJB @PostDestroy (это достаточно хороший индикатор того, когда контейнер закрывается). Вот и все? Или есть что-то еще, чего мне не хватает ...!
Робин Баджадж
извините, я имел в виду метод @PreDestroy
Робин Баджадж
« Log4j регистрирует свои регистраторы как JMX MBeans. ». Мой сервлет использует log4j 1.2. Я не вижу никаких MBean-компонентов log4j.
Абдул
Все, что вам нужно сделать, это один раз вызвать DOMConfigurator.configureAndWatch (). Как я могу этого добиться?
gstackoverflow
5
Log4j2 можно настроить для обновления своей конфигурации путем сканирования файла log4j 2 .xml (или его эквивалента) с заданными интервалами. Просто добавьте параметр monitorInterval в свой тег конфигурации. См. Строку 2 образца файла log4j 2 .xml, в которой log4j сообщает о необходимости повторного сканирования своей конфигурации, если с момента последнего события журнала прошло более 5 секунд.
Есть дополнительные шаги, чтобы заставить эту работу работать, если вы выполняете развертывание в экземпляре Tomcat, внутри IDE или при использовании весенней загрузки. Здесь это кажется несколько выходящим за рамки и, вероятно, заслуживает отдельного вопроса.
@vsingh, вы развертываете внутри Spring boot, tomcat, контейнер или с IDE? Иногда в этих случаях могут быть дополнительные шаги (не ошибка log4j2) - в основном приложение не видит изменения файла, потому что он был скопирован в другое место с помощью фреймворка или инструмента.
Кимбалл Робинсон,
Привет, я тестировал это на Jboss6.4 и обновил файл конфигурации log4j2 в том месте (внутри файла .war), где приложение может видеть файл. Однако это все еще не сработало. Любое предложение?
MidTierDeveloper
3
Этот ответ не поможет вам динамически изменять уровень ведения журнала, вам необходимо перезапустить службу, если вы нормально перезапускаете службу, используйте приведенное ниже решение.
Я сделал это, чтобы изменить уровень журнала log4j, и у меня это сработало, я не ссылался ни на один документ. Я использовал это значение системного свойства, чтобы установить имя файла журнала. Я использовал ту же технику для установки уровня ведения журнала, и это сработало.
передал это как параметр JVM (я использую Java 1.7)
К сожалению, это не приведет к динамическому изменению уровня ведения журнала, для этого требуется перезапуск службы.
Все, что вы упомянули, кажется нормальным, но вопрос заключается в динамическом изменении уровня ведения журнала.
Azim
Для этого вам необходимо перезапустить сервис. Это не меняет динамически уровни ведения журнала.
кк.
2
С log4j 1.x я считаю, что лучший способ - использовать DOMConfigurator для отправки одной из предопределенных наборов конфигураций журнала XML (скажем, для обычного использования и для отладки).
Их можно использовать примерно так:
publicstaticvoid reconfigurePredefined(String newLoggerConfigName){String name = newLoggerConfigName.toLowerCase();if("default".equals(name)){
name ="log4j.xml";}else{
name ="log4j-"+ name +".xml";}if(Log4jReconfigurator.class.getResource("/"+ name)!=null){String logConfigPath =Log4jReconfigurator.class.getResource("/"+ name).getPath();
logger.warn("Using log4j configuration: "+ logConfigPath);try(InputStream defaultIs =Log4jReconfigurator.class.getResourceAsStream("/"+ name)){newDOMConfigurator().doConfigure(defaultIs,LogManager.getLoggerRepository());}catch(IOException e){
logger.error("Failed to reconfigure log4j configuration, could not find file "+ logConfigPath +" on the classpath", e);}catch(FactoryConfigurationError e){
logger.error("Failed to reconfigure log4j configuration, could not load file "+ logConfigPath, e);}}else{
logger.error("Could not find log4j configuration file "+ name +".xml on classpath");}}
Просто вызовите это с соответствующим именем конфигурации и убедитесь, что вы поместили шаблоны в путь к классам.
какова точка запуска этого метода? как он узнает, что этот метод должен вызываться всякий раз, когда происходит изменение в конфигурации log4j?
asgs
Я до сих пор не понимаю, что вы имеете в виду «по запросу». Не могли бы вы показать фрагмент, где вы подключаете этот метод?
asgs 02
2
Вот и все: это фрагмент контроллера, в котором мы его используем. У нас есть страница администратора с некоторыми ссылками для динамической перенастройки ведения журнала, которая затем выполняет GET для ссылки / admin / setLogLevel? Level = Error, а затем мы перехватываем это в контроллере, например, @RequestMapping (value = "setLogLevel", method = RequestMethod.GET) public ModelAndView setLogLevel (@RequestParam (value = "level", required = true) String level) {Log4jReconfigurator.reconfigureExisting (level);
ISparkes
Итак, «по требованию» означает «когда пользователь нажимает кнопку» в моем случае
ISparkes
Ах, понял. Итак, ваша консоль администратора должна сделать запрос для вызова этого метода.
asgs 05
0
Я успешно использовал этот метод, чтобы уменьшить подробность журналов "org.apache.http":
Если вы хотите изменить уровень ведения журнала всех регистраторов, используйте метод ниже. Это будет перечислять по всем регистраторам и изменить уровень ведения журнала на заданный уровень. Пожалуйста , убедитесь , что вы НЕ имеете log4j.appender.loggerName.Threshold=DEBUGнабор свойств в вашем log4j.propertiesфайле.
Ответы:
Изменить уровень журнала очень просто; изменение других частей конфигурации приведет к более глубокому подходу.
Изменения постоянны на протяжении всего жизненного цикла
Logger
. При повторной инициализации конфигурация будет считана и использована, поскольку установка уровня во время выполнения не сохраняет изменение уровня.ОБНОВЛЕНИЕ: если вы используете Log4j 2, вы должны удалить вызовы в
setLevel
соответствии с документацией, поскольку это может быть достигнуто с помощью классов реализации.источник
LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
File Watchdog
Log4j может отслеживать
log4j.xml
изменения конфигурации в файле. Если вы измените файл log4j, log4j автоматически обновит уровни журнала в соответствии с вашими изменениями. Подробности см. В документацииorg.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
). По умолчанию время ожидания между проверками составляет 60 секунд. Эти изменения будут постоянными, поскольку вы напрямую меняете файл конфигурации в файловой системе. Все, что вам нужно сделать, это один раз вызвать DOMConfigurator.configureAndWatch ().Внимание: метод configureAndWatch небезопасен для использования в средах J2EE из-за утечки потока
JMX
Другой способ установить уровень журнала (или перенастроить в целом) log4j - использовать JMX. Log4j регистрирует свои регистраторы как JMX MBeans. Используя консоли серверов приложений MBeanServer (или jconsole.exe JDK), вы можете перенастроить каждый отдельный регистратор. Эти изменения не являются постоянными и будут сброшены до конфигурации, установленной в файле конфигурации, после перезапуска приложения (сервера).
Ручной работы
Как описано Аароном, вы можете установить уровень журнала программно. Вы можете реализовать это в своем приложении так, как хотите. Например, у вас может быть графический интерфейс, в котором пользователь или администратор изменяет уровень журнала, а затем вызывает
setLevel()
методы в регистраторе. Сохраняете ли вы настройки где-нибудь или нет, решать вам.источник
Log4j2 можно настроить для обновления своей конфигурации путем сканирования файла log4j 2 .xml (или его эквивалента) с заданными интервалами. Просто добавьте параметр monitorInterval в свой тег конфигурации. См. Строку 2 образца файла log4j 2 .xml, в которой log4j сообщает о необходимости повторного сканирования своей конфигурации, если с момента последнего события журнала прошло более 5 секунд.
Есть дополнительные шаги, чтобы заставить эту работу работать, если вы выполняете развертывание в экземпляре Tomcat, внутри IDE или при использовании весенней загрузки. Здесь это кажется несколько выходящим за рамки и, вероятно, заслуживает отдельного вопроса.
источник
Я сделал это, чтобы изменить уровень журнала log4j, и у меня это сработало, я не ссылался ни на один документ. Я использовал это значение системного свойства, чтобы установить имя файла журнала. Я использовал ту же технику для установки уровня ведения журнала, и это сработало.
передал это как параметр JVM (я использую Java 1.7)
К сожалению, это не приведет к динамическому изменению уровня ведения журнала, для этого требуется перезапуск службы.
в файле log4j.properties я добавил эту запись
Я попытался
Все заработало. надеюсь это поможет!
У меня есть следующие зависимости в моем pom.xml
источник
С log4j 1.x я считаю, что лучший способ - использовать DOMConfigurator для отправки одной из предопределенных наборов конфигураций журнала XML (скажем, для обычного использования и для отладки).
Их можно использовать примерно так:
Просто вызовите это с соответствующим именем конфигурации и убедитесь, что вы поместили шаблоны в путь к классам.
источник
Я успешно использовал этот метод, чтобы уменьшить подробность журналов "org.apache.http":
источник
Для log4j 2 API вы можете использовать
источник
Если вы хотите изменить уровень ведения журнала всех регистраторов, используйте метод ниже. Это будет перечислять по всем регистраторам и изменить уровень ведения журнала на заданный уровень. Пожалуйста , убедитесь , что вы НЕ имеете
log4j.appender.loggerName.Threshold=DEBUG
набор свойств в вашемlog4j.properties
файле.источник
Вы можете использовать следующий фрагмент кода
источник