Как мне настроить Spring и SLF4J, чтобы я мог получать логи? - PullRequest
43 голосов
/ 02 августа 2010

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

Однако я получаю это предупреждение и не веду журнал.быть найден для регистратора (org.springframework.context.support.ClassPathXmlApplicationContext).log4j: WARN Пожалуйста, правильно инициализируйте систему log4j.log4j: WARN См. http://logging.apache.org/log4j/1.2/faq.html#noconfig для получения дополнительной информации.

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

Ответы [ 7 ]

46 голосов
/ 16 августа 2010

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

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

Если вы используете 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>
27 голосов
/ 02 августа 2010

Вы найдете пример на 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>
6 голосов
/ 17 ноября 2012

Только для полноты, вариант 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).

5 голосов
/ 29 января 2012

Использование конфигурации удара для реализации 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> 

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

1 голос
/ 31 декабря 2012

Мне нравится способ 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, поэтому не нужно ставить так много зависимостей

1 голос
/ 02 августа 2010

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

0 голосов
/ 09 октября 2015

Просто добавьте lazy-init="false", чтобы охотно загрузить bean-компонент для конфигурации log4j в корневой контекст. Это должно решить ПРЕДУПРЕЖДЕНИЕ сообщение 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 для некоторых случаев)

...