кошмарная регистрация java и log4j не ведут себя, как ожидалось с spring + tomcat6 - PullRequest
1 голос
/ 18 мая 2010

У меня есть приложение 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

Как видите, отладка включена для compass и 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>

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

Ответы [ 4 ]

3 голосов
/ 18 мая 2010

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

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

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

1 голос
/ 18 мая 2010

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

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

0 голосов
/ 18 мая 2010

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

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

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

0 голосов
/ 18 мая 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>

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

...