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

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

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

например.

<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: WARN Для регистратора не найдено никаких приложений (org.springframework.context.support.ClassPaспасибоmlApplicationContext). log4j: WARN Пожалуйста, правильно инициализируйте систему log4j. log4j: WARN См. http://logging.apache.org/log4j/1.2/faq.html#noconfig для получения дополнительной информации.

Я искал googled и не могу найти простой пример по настройке этого. Любые идеи?

Ответ 1

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

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>

Ответ 2

Вы найдете пример в 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>

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Просто добавьте lazy-init="false", чтобы загрузить конфигурацию bean для 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 или префикс 'файл:' как -Dlog4j.configuration=file:conf/log4j.properties для некоторых случаев)