2010-08-02 2 views
40

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

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

например.

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

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

+0

Я предполагаю. Работает ли это иначе, если вы попробуете полный путь. * C: /config/log4j.xml * – JoseK

+0

Nope. Жесткое кодирование не помогает. = ( –

ответ

43

В дополнение к ответу Jatin в:

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

Мне нравится третий подход d здесь - http://slf4j.org/faq.html#excludingJCL - использование пустых артефактов. Этот параметр рекомендуется в текущей версии справочника Spring Reference. –

26

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

Пример имеет конфигурационный файл log4j непосредственно в пути к классам, а не в каталоге конфигурации, который мне бы хотелось. –

+0

На самом деле это немного помогло. Теперь я зарегистрировался в своем приложении. Это просто весна это жалоба –

+0

Если какой-либо класс жалуется, вам нужно добавить требуемый пакет в список упакованных, зарегистрированных в регистраторе. Вы также можете поместить его в папку конфигурации и добавить эту папку в путь класса. – Jatin

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> 

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

6

Просто для полноты картины, 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 зависимость, которая прорастает из весенней зависимости, как в принятом (Stijn's) ответе.

1

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

0

Просто добавьте 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 или в качестве параметра виртуальной машины Java (-Dlog4j.configuration=.../conf/log4j.xml или «файл:» префикс, как -Dlog4j.configuration=file:conf/log4j.properties для некоторых случаев)

Смежные вопросы