Log4j: откуда он себя инициализирует - PullRequest
0 голосов
/ 30 июля 2010

Мы связываем Log4j 1.2.15 с нашим простым Swing-приложением и загружаем наш собственный файл свойств из файловой системы при запуске:

import org.apache.log4j.*;

...
System.setProperty("log4j.defaultInitOverride", "true");
...
File log4jPropertiesFile = ...
PropertyConfigurator.configure(log4jPropertiesFile.getAbsolutePath());
...

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

Может ли быть так, что Log4j каким-то образом переопределяет наши настройки, если где-то присутствует другой файл конфигурации где-то на пользователемашина в наличии?Как мы можем предотвратить использование этого?

1 Ответ

4 голосов
/ 30 июля 2010

В документах есть целый параграф , подробно описывающий, как Log4j инициализирует себя:

Точный алгоритм инициализации по умолчанию определяется следующим образом:

  1. Установка системного свойства log4j.defaultInitOverride любым другим значением, кроме «false», приведет к тому, что log4j пропустит процедуру инициализации по умолчанию (эта процедура).
  2. Задайте для переменной строки ресурса значение log4j.свойство системы конфигурации.Предпочтительный способ указать файл инициализации по умолчанию - через системное свойство log4j.configuration.Если системное свойство log4j.configuration не определено, задайте для ресурса строковой переменной значение по умолчанию «log4j.properties».
  3. Попытка преобразовать переменную ресурса в URL.
  4. Если переменная ресурса не может быть преобразована в URL-адрес, например, из-за MalformedURLException, выполните поиск ресурса из пути к классам, вызвав org.apache.log4j.helpers.Loader.getResource (resource, Logger.class), который возвращает URL-адрес,Обратите внимание, что строка «log4j.properties» представляет собой некорректный URL.См. Список найденных местоположений в Loader.getResource (java.lang.String).
  5. Если не удалось найти URL-адрес, отмените инициализацию по умолчанию.В противном случае настройте log4j из URL.PropertyConfigurator будет использоваться для анализа URL-адреса для настройки log4j, если только URL-адрес не заканчивается расширением «.xml», и в этом случае будет использоваться DOMConfigurator.Вы можете дополнительно указать пользовательский конфигуратор.Значение системного свойства log4j.configuratorClass принимается как полное имя класса вашего пользовательского конфигуратора.Указанный вами настраиваемый конфигуратор должен реализовывать интерфейс Configurator.

По общему признанию, это чертовски сложно понять.По сути, самое простое, что вы можете сделать, это поместить log4j.properties в classpath вашего приложения, и оно будет найдено.Все остальное ... изящество.Лично я иногда явно вызываю класс BasicConfigurator в своем main, иногда настраивая (жестко запрограммированный) некоторые вещи, которые в противном случае могли бы появиться в файле ... независимо от того, что требуют мои обстоятельства.Вы можете инициализировать log4j полностью программно, и это как бы поставило вопрос о файле конфигурации.Хотя это также сделает вашу конфигурацию менее гибкой.

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