Рабочая конфигурация log4j игнорируется классами Spring

StackOverflow https://stackoverflow.com/questions/2146671

  •  23-09-2019
  •  | 
  •  

Вопрос

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

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

Оскорбительное сообщение: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 использует common-logging, а не log4j.Это возможная причина?Любое обходное решение?

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

<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>

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

Еще немного информации:

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

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

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

Нет правильного решения

Другие советы

Обратите внимание, что в примерах Spring они используют slf4j для маршрутизации сообщений журнала из Commons Logging в log4j.У Мейвена 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>

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

<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>

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

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

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

-Dorg.apache.commons.logging.diagnostics.dest=STDOUT

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

В предыдущем ответе упоминалось использование артефактов 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top