Рабочая конфигурация log4j игнорируется классами Spring - PullRequest
0 голосов
/ 27 января 2010

Я использую log4j, и он работает просто отлично. Файл log4j.xml находится в моем classpath, я использую appender и category ... опять же, он отлично работает для моего кода или кода другой библиотеки.

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

Оскорбительное сообщение: org.springframework.jms: какая-то ошибка .... В целом, все классы пакета org.springframework отправляют сообщение на стандартный вывод.

Так что я положил это в свой log4j.xml:

<appender name="JMS-ERROR" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="tms.logs.folder/tms.logs.files.prefix-jms-error.log"/>
    <param name="Append" value="true"/>
    <param name="MaxFileSize" value="1000KB"/>
    <param name="MaxBackupIndex" value="2"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="**DVIDEA** %d{dd.MM.yyyy HH:mm:ss} %c  %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="FATAL" />
    </filter>
</appender>


<category name="org.springframework.jms" additivity="false">
    <appender-ref ref="JMS-ERROR"/>
</category>

Это работа с другими библиотеками. Почему не весна?

Я провожу некоторые исследования, и кажется, что Spring использует обычное ведение журнала, а не log4j. Это возможная причина? Есть обходной путь?

Я попытался добавить log4jConfigurationListener в мой web.xml. он работает, но я до сих пор не имею никакого контроля над сообщением об ошибке пружины.

<context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
   <param-name>log4jRefreshInterval</param-name>
   <param-value>10000</param-value>
</context-param>
<listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Редактировать:

Дополнительная информация:

  • я использую Tomcat 5.5
  • log4j.property (старая конфигурация log4j) все еще присутствует по исторической причине. Я попытаюсь удалить его => без изменений.

РЕДАКТИРОВАТЬ 2: Я использую следующий обходной путь, но я не доволен им: он не настраивается

java.util.logging.Logger springLogger = Logger.getLogger("org.springframework.jms");
springLogger.setLevel(Level.OFF);

Ответы [ 4 ]

1 голос
/ 27 января 2010

Обратите внимание, что в примерах Spring они используют slf4j для маршрутизации сообщений журнала из Commons Logging в log4j. В Maven's pom.xml это выглядит так:

<!-- Exclude Commons Logging -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>org.springframework.context</artifactId>
    <version>${spring.version}</version>
    <exclusions>
        <!-- Exclude Commons Logging in favor of SLF4j -->
        <exclusion>
            <groupId>org.apache.commons</groupId>
            <artifactId>com.springsource.org.apache.commons.logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- Add slf4j API -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

<!-- Add Commons Logging -> slf4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.org.apache.commons.logging</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>

<!-- Add slf4j -> log4j bridge -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>com.springsource.slf4j.log4j</artifactId>
    <version>${slf4j.version}</version>
    <scope>runtime</scope>
</dependency>
0 голосов
/ 13 марта 2015

Вы должны использовать SLF4J и включить мост на нужную платформу для ведения журналов (log4j), но вы должны также исключить ведение общего журнала из всех других мест, где он может быть загружен. IDE, чтобы сделать это, или вы можете вставить фиктивную запись для регистрации общего достояния. Подробнее об этом см. Запись SLF4J FAQ

Предыдущий ответ, упомянутый с использованием артефактов com.springsource, однако, если вы используете Maven Central, правильный способ сделать это:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.10</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.10</version>
</dependency>
0 голосов
/ 27 января 2010

Spring использует Apache Commons Logging, который, в свою очередь, решает, использовать ли STDOUT (через java.util.logging) или Log4j. Если вы получаете вывод Spring на STDOUT, то по какой-то причине в общем журнале не было log4j.

Если вы зададите системное свойство org.apache.commons.logging.diagnostics.dest, то для регистрации его диагностики можно настроить использование общего журнала, сообщив, какие шаги он предпринимает для определения в log4j.

Итак, в вашем скрипте запуска tomcat установите системное свойство, например,

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT
0 голосов
/ 27 января 2010

Вам может понадобиться:

<bean id="log4jInitialization"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="targetClass"
            value="org.springframework.util.Log4jConfigurer" />
        <property name="targetMethod" value="initLogging" />
        <property name="arguments">
            <list>
                <value>conf/log4j.xml</value>
            </list>
        </property>
    </bean>
...