Как мне настроить Spring и SLF4J, чтобы я мог получать логи?

У меня есть приложение Maven & Spring, в которое я хочу войти. Я хочу использовать SLF4J.

Я хочу поместить все мои конфигурационные файлы в каталог {classpath}/config, включая log4j.xml, а затем инициализировать с помощью пружинного компонента.

например

<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>classpath:config/log4j.xml</value>
        </list>
    </property>
</bean>

Однако я получаю это предупреждение и не веду журнал.

log4j: ПРЕДУПРЕЖДЕНИЕ. Для регистратора не найдено ни одного добавителя (org.springframework.context.support.ClassPathXmlApplicationContext). log4j:WARN Пожалуйста, правильно инициализируйте систему log4j. log4j:WARN См. http://logging.apache.org/log4j/1.2/faq.html для получения дополнительной информации.

Я погуглил и не могу найти простой пример по настройке. Есть идеи?

7 ответов

Решение

В дополнение к ответу Джатина:

Spring использует Jakarta Commons Logging в качестве API регистрации. Для того, чтобы войти в slf4j, вам необходимо убедиться, commons-logging не на пути к классам. jcl-over-slf4j является заменой банку для регистрации общего достояния.

Если вы используете Maven, вы можете определить, откуда берется общение mvn dependency:tree и исключить его из всех зависимостей, которые требуют его, используя исключения зависимостей. Вам может понадобиться запустить mvn dependency:tree хотя несколько раз, потому что это показывает только первый случай переходной зависимости.

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${org.springframework.version}</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-logging</artifactId>
      <groupId>commons-logging</groupId>
    </exclusion>
  </exclusions>
</dependency>

Вы можете найти пример на https://github.com/mbogoevici/spring-samples/tree/master/mvc-basic/trunk. Вам нужно включить некоторые зависимости в ваш файл POM, чтобы включить ведение журнала.

<!-- Logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${org.slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${org.slf4j.version}</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
        <scope>runtime</scope>
    </dependency>

Просто ради полноты logback-classic вариант:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.6</version>
    <scope>runtime</scope>
</dependency>

Не забудьте однако отключить commons-logging зависимость, которая проистекает из зависимости Spring, как в принятом ответе (Stijn's).

Использовать конфигурацию удара для реализации JCL API на classpath:

<dependencies>
       <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>3.0.0.RELEASE</version>
          <scope>runtime</scope>
          <exclusions>
             <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
             </exclusion>
          </exclusions>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>jcl-over-slf4j</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.5.8</version>
          <scope>runtime</scope>
       </dependency>
       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.14</version>
          <scope>runtime</scope>
       </dependency>
    </dependencies> 

Для получения дополнительной информации проверьте здесь

Мне нравится способ logback, и для slf4j мы делаем похожий конфиг:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

slf4j-log4j12 автоматически введет slf4j-api и log4j, поэтому не нужно ставить так много зависимостей

Сохранить файл log4j в пакете по умолчанию

Просто добавь lazy-init="false" чтобы загружать компонент для конфигурации log4j в корневой контекст. Это должно решить сообщение WARN log4j:WARN No appenders could be found for logger

Пример:

<bean id="log4jInitialization" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" lazy-init="false">

Более лучшим подходом было бы иметь конфигурацию в web.xml или в качестве параметра JVM (-Dlog4j.configuration=.../conf/log4j.xml или с префиксом file: как -Dlog4j.configuration=file:conf/log4j.properties для некоторых случаев)

Другие вопросы по тегам