2010-04-26 2 views
23

Я пробовал log4j в простом тестовом приложении. Я создаю новый проект Java в eclipse и добавляю log4j JAR (v1.2.16) в мой путь сборки. Затем я создаю простой класс, который печатает Hello World. Затем я использую класс log4j Logger для регистрации информационного сообщения. Когда я запускаю приложение, я вижу сообщение журнала, используя то, что я предполагаю, как приложение и макет по умолчанию. Отлично. У меня возникают проблемы с добавлением моей собственной конфигурации. Это то, что я сделал:Где/как log4j ищет файл log4j.properties?

Создал файл log4j.properties с пользовательским уровнем и уровнем журнала и помещал его в папку src (которая после компиляции копируется в папку bin). Запустите приложение - никаких изменений.

Я пробую добавить PropertyConfigurator.configure("log4j.properties"). Запустите приложение - никаких изменений. Нет ошибок, но никаких изменений.

Что мне нужно сделать, чтобы загрузить log4j для загрузки моего конфигурационного файла?

ответ

7

Argh. Я обнаружил, что проблема заключалась в том, что eclipse импортировал неправильный класс Logger. Он импортировал java.util.logging.Logger, который, конечно же, имеет собственную конфигурацию, отличную от log4j. О, хорошо, надеюсь, что кто-то еще это сделает и решит, прочитав этот вопрос.

+0

ha, плохой импорт, который не обнаружен во время компиляции, является болью ... :-) – leonbloy

+0

Я делаю это все время. – justkt

7

Вы можете включить внутреннюю отладку log4j, установив системное свойство log4j.debug. Помимо прочего, это приведет к тому, что log4j покажет, как он настраивается.

Вы можете попытаться явно указать URL-адрес конфигурационного файла с системным свойством log4j.configuration.

См. Также: this question.

2

log4j.properties должно быть в вашем пути к классу. «Папка src», скопированная в папку «bin» (я предполагаю, что вы говорите об установке Eclipse здесь), обычно принадлежит вашему пути к классам, поэтому ее нужно найти (вы размещаете ее в верхней части «src» "папка, правда?)

34

Для тех, кто не RTFM, смотрите под заголовком Default Initialization Procedure, где вы найдете следующее:

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

  1. Установка log4j.defaultInitOverride Системное свойство для любого другого значения, кроме «false», приведет к тому, что log4j пропустит процедуру инициализации по умолчанию (эта процедура).
  2. Задайте переменную строки ресурса на значение системного свойства log4j.configuration. Предпочтительный способ указать файл инициализации по умолчанию через системное свойство log4j.configuration . В случае, если системное свойство log4j.configuration не определено , установите для него значение переменной строки по умолчанию значение «log4j.properties».
  3. Попытка преобразования переменной ресурса в URL.
  4. Если переменная ресурса не может быть преобразована в URL-адрес, например, из-за ошибки MalformedURLEx, выполните поиск ресурса из пути к классам , вызвав 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.
+0

Иногда вам просто нужно RTFM. Хотя это немного сложно, эта информация является авторитетной и очень явной и помогла мне решить проблему. +1! –

+6

FM немного устарел. Рассматривая источник для 'LogManager.java' в 1.2.17, по умолчанию он ищет' log4j.xml' (не упомянутый в этом документе), прежде чем он ищет 'log4j.properties', а константа, определяющая файл свойств, объявлен '@ устаревшим' (хотя кажется, что это только для предотвращения внешнего использования константы). – bacar

1

Я знаю, что это несколько месяцев, но я чувствую необходимость указать на то, что папка экра не «скопирован» в папку BIN, и не является частью вашей среды выполнения классов. ... (путь сборки - это не путь выполнения класса!). Eclipse компилирует исходные файлы в папку src в папку bin (или что вам нравится). Это папка bin, которая является частью вашего пути к среде выполнения.

Просто хотел указать на это, так как эти потоки часто читаются очень младшими программистами, и я всегда разочарован тем, что большинство из них не понимают изящность пути Java classpath и, следовательно, допускают ошибочные ошибки против Это.

4

Проблема может быть в classpath, если был определен classpath.

Причина, по которой это не была загрузка (в моем случае): В одном из моих банок был конфликтный файл log4j.properties, и он перегружал его в моем classpath.

Одним словом, если ваш файл log4j.properties не загружается, может возникнуть другой код в другом месте.

Просто подумал, что я тоже брошу это, если кто-то еще столкнется с этим. Я провел последние 5 часов, пытаясь понять, почему мой дефолт log4j.properties не загрузился.

Смежные вопросы