Как настроить 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
для некоторых случаев)