Как мне настроить 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, поэтому не нужно ставить так много зависимостей
Просто добавь 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
для некоторых случаев)