Кошмар ведения журнала Java и log4j ведут себя не так, как ожидалось, с Spring + tomcat6

У меня есть приложение Spring, которое настроило log4j (через xml) и работает на Tomcat6, которое работало нормально, пока мы не добавим кучу зависимостей через Maven. В какой-то момент все приложение просто начало протоколировать часть того, что должно было быть объявлено в файле log4.xml.

«небольшой разглагольствования» Почему ведение журнала должно быть таким сложным в мире Java? почему вдруг приложение, которое было нормально, начинает вести себя так странно и почему его так чертовски сложно отлаживать?

Я читал и пытался решить эту проблему в течение нескольких дней, но пока безуспешно, надеюсь, какой-нибудь эксперт здесь может дать мне некоторое представление об этом

Я добавил параметр отладки log4j, чтобы проверить, читает ли log4j файл конфигурации и его значения, и это то, что показывает его часть.

log4j: Level value for org.springframework.web is  [debug].
log4j: org.springframework.web level set to DEBUG
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.compass] additivity to [true].
log4j: Level value for org.compass is  [debug].
log4j: org.compass level set to DEBUG

Как видите, отладка включена для компаса и spring.web, но показывает только уровень «INFO» для обоих пакетов. В моем конфигурационном файле log4j нет ничего необычного, просто обычный ConsoleAppender.

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

 <!-- Appenders -->
 <appender name="console" class="org.apache.log4j.ConsoleAppender">
  <param name="Target" value="System.out" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p: %c - %m%n" />
  </layout>
 </appender>

В чем хитрость, чтобы заставить это работать? Что это мое недоразумение здесь? Может ли кто-нибудь указать мне правильное направление и объяснить, как я могу сделать этот беспорядок с журналированием более пуленепробиваемым?


person maverick    schedule 17.05.2010    source источник
comment
Работает ли журнал снова, когда вы удаляете эти зависимости? Просто пытаюсь сузить проблему...   -  person FelixM    schedule 18.05.2010


Ответы (4)


Это может быть не log4j, который ведет журнал, и, следовательно, ваша конфигурация log4j будет проигнорирована. Spring ведет журналы с помощью Commons Logging, API-интерфейса, который может делегировать различные платформы ведения журналов, включая log4j. Чтобы решить, какую реализацию использовать, ведение журнала общих ресурсов просматривает путь к классам.

Если вы добавили зависимость, которая перетащила свою собственную реализацию ведения журнала в путь к классам, ведение журнала общих ресурсов теперь может использовать другую реализацию.

Я рекомендую установить точку останова при вызове средства ведения журнала и проследить выполнение, чтобы увидеть, какая реализация ведения журнала используется.

person meriton    schedule 17.05.2010
comment
Большое спасибо, меритон, действительно была другая реализация, на самом деле это был slf4j-simple с отключенным уровнем отладки по умолчанию. После изменения его на slf4j-log4j12 он начинает ведение журнала на основе настроек, установленных в log4j.xml. - person maverick; 18.05.2010

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

Запустите mvn dependency:tree, чтобы увидеть, что загружается, а затем посмотрите, имеет ли какая-либо из этих зависимостей конфигурацию Log4j.

person Brian Agnew    schedule 17.05.2010
comment
спасибо за попытку, но информация об отладке log4 показывает, что он использует мой файл конфигурации, а не другой log4j: Using URL [file:/home/xxxxxx/comp/.metadata/.plugins/org.eclipse.wst.server.core/tmp0 /wtpwebapps/app1/WEB-INF/classes/log4j.xml] для автоматической настройки log4j. log4j: - person maverick; 18.05.2010

Я думаю, ваша проблема в том, что вы не устанавливаете параметр threshold для своих приложений и (возможно) потому, что вы не назначаете эти приложения своим регистраторам.

Попробуйте добавить param name="threshold" value="debug" к вашим приложениям, а затем явно добавить их к конкретным (или корневым) регистраторам следующим образом:

<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="threshold" value="debug" />
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    </layout>
</appender>

<logger name="org.springframework.web">
    <level value="debug" />
    <appender-ref ref="console" />
</logger>

Кроме того, на на этой странице указано: "Это приложение не будет регистрировать сообщения с приоритетом ниже указанный здесь, даже если приоритет категории установлен ниже», что, вероятно, является источником вашей проблемы.

person Mornedhel    schedule 17.05.2010
comment
Спасибо за подсказку о пороге и уровне на приложение, очень полезно - person maverick; 18.05.2010

Это хорошая ветка для прочтения: http://forum.springsource.org/showthread.php?t=88250

Переходя к делу, кажется, что у автора была проблема с настройкой безопасности Tomcat. Обновленный файл политики Tomcat устранил проблему.

Вероятно, это как-то связано с чтением вашего файла log4j.xml за пределами веб-приложения.

person Rednip    schedule 17.05.2010
comment
Спасибо за информацию, хотя это не мой случай, важно, чтобы это было ясно. - person maverick; 18.05.2010