今天运行项目的时候,查看控制台时突然发现日志的输出格式变了,但最近又没动过log4j2的配置文件,由此非常的困惑。
折腾到最后怀疑是加载了别的地方的配置文件或者因为某些原因使用了默认的配置属性(因为控制台里有输出日志,只是输出格式不是我们想要的那样,从而说明配置文件没起作用)。
后来在网上发现很多相类似的问题,其中大多数原因都是因为包冲突或包里含有额外的配置文件等造成的。
由此我也怀疑是最近新增加的activemq-all包而引发的问题。
于是在Tomcat的VM参数里添加-Dlog4j.debug参数来显示log4j的有关信息。
log4j: Trying to find [log4j.xml] using context classloader
ParallelWebappClassLoader context: ROOT delegate: false ----------> Parent
Classloader: java.net.URLClassLoader@cac736f . log4j: Trying to find [log4j.xml
] using ParallelWebappClassLoader context: ROOT delegate: false ---------->
Parent Classloader: java.net.URLClassLoader@cac736f class loader. log4j: Trying
to find [log4j.xml] using ClassLoader.getSystemResource(). log4j: Trying to
find [log4j.properties] using context classloader ParallelWebappClassLoader
context: ROOT delegate: false ----------> Parent Classloader: java.net
.URLClassLoader@cac736f . log4j: Using URL
[jar:file:/D:/IdeaProjects/Demo3/target/Demo3/WEB-INF/lib/activemq-all-5.15.4
.jar!/log4j.properties] for automatic log4j configuration. log4j: Reading
configuration from URL
jar:file:/D:/IdeaProjects/Demo3/target/Demo3/WEB-INF/lib/activemq-all-5.15.4.jar
!/log4j.properties log4j: Parsing for [root] with value=[INFO, console]. log4j:
Level token is [INFO].log4j: Category root set to INFO log4j: Parsing appender
named"console". log4j: Parsing layout options for "console". log4j: Setting
property [conversionPattern] to [%5p | %m%n]. log4j: End of parsing for
"console". log4j: Setting property [threshold] to [INFO]. log4j: Parsed
"console" options. log4j: Parsing for [org.apache.activemq.spring] with
value=[WARN].log4j: Level token is [WARN]. log4j: Category org.apache.activemq
.spring set to WARN log4j: Handling log4j.additivity.org.apache.activemq.spring
=[null]log4j: Parsing for [org.springframework] with value=[WARN]. log4j: Level
token is [WARN].log4j: Category org.springframework set to WARN log4j: Handling
log4j.additivity.org.springframework=[null] log4j: Parsing for [org.eclipse
.jetty] with value=[WARN]. log4j: Level token is [WARN]. log4j: Category org
.eclipse.jetty set to WARN log4j: Handling log4j.additivity.org.eclipse.jetty
=[null]log4j: Parsing for [org.apache.activemq.web.handler] with value=[WARN].
log4j: Level token is [WARN]. log4j: Category org.apache.activemq.web.handler
set to WARN log4j: Handling log4j.additivity.org.apache.activemq.web.handler
=[null]log4j: Parsing for [org.apache.camel] with value=[INFO]. log4j: Level
token is [INFO].log4j: Category org.apache.camel set to INFO log4j: Handling
log4j.additivity.org.apache.camel=[null] log4j: Parsing for [org.apache.xbean]
with value=[WARN].log4j: Level token is [WARN]. log4j: Category org.apache.xbean
set to WARN log4j: Handling log4j.additivity.org.apache.xbean=[null] log4j:
Finished configuring.
看到这一行了没?
log4j: Reading configuration from URL
jar:file:/D:/IdeaProjects/Demo3/target/Demo3/WEB-INF/lib/activemq-all-5.15.4.jar!/log4j.properties
果然是先加载了activemq-all-5.15.4.jar中的log4j.properties这个配置文件,自然而然的会忽略我们自己编写的log4j2.xml文件。
另外还有这部分的控制台输出:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [
jar:file:/D:/IdeaProjects/Demo3/target/Demo3/WEB-INF/lib/activemq-all-5.15.4
.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:
file:/D:/IdeaProjects/Demo3/target/Demo3/WEB-INF/lib/log4j-slf4j-impl-2.8.2.jar!
/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes
.html#multiple_bindings for an explanation.
其实Tomcat每次启动都会输出的这几行也在提示我们包起冲突了,只是我们没有注意到。
既然找到了原因,解决方法就很多了:
1. 弃用activemq-all-5.15.4.jar,换成其它的分模块的包。
2. 删除activemq-all-5.15.4.jar包中的log4j.properties。(不推荐,万一哪天换新版本的activemq,还得手动删除)
<!-- 原先的Maven中的配置(省略了其它的包) --> <!--
https://mvnrepository.com/artifact/org.apache.activemq/activemq-all --> <
dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</
artifactId> <version>5.15.4</version> </dependency> <!--
修改后的Maven中的配置(同时添加了相关spring中的包) --> <?xml version="1.0" encoding="UTF-8"?> <
project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.ths.Demo3</groupId> <artifactId>
Demo3</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <
name>Demo3 Maven Webapp</name> <!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties> <project.build.sourceEncoding>
UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</
maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <
spring.version>4.3.18.RELEASE</spring.version> <hibernate.version>5.2.17.Final</
hibernate.version> <log4j.version>2.8.2</log4j.version> <activemq.version>5.15.4
</activemq.version> </properties> <dependencies> <!-- junit --> <!--
https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</
groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</
scope> </dependency> <!-- log4j --> <dependency> <groupId>
org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <
version>${log4j.version}</version> </dependency> <dependency> <groupId>
org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>
${log4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <
groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <
version>${log4j.version}</version> </dependency> <dependency> <groupId>
org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>
${log4j.version}</version> </dependency> <!-- spring核心包 --> <dependency> <
groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <
version>${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-web</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-context-support</artifactId> <
version>${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-test</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-context</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>
${spring.version}</version> </dependency> <dependency> <groupId>
org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>
${spring.version}</version> </dependency> <!-- hibernate--> <dependency> <
groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version
>${hibernate.version}</version> </dependency> <!--
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 --> <
dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</
artifactId> <version>2.1.1</version> </dependency> <!--
https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <
groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>
5.1.38</version> </dependency> <!--
https://mvnrepository.com/artifact/javax/javaee-api --> <dependency> <groupId>
javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <
scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</
groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </
dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</
artifactId> <version>1.2</version> <scope>runtime</scope> </dependency> <
dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <
version>1.1.2</version> </dependency> <!--activemq begin--> <dependency> <
groupId>org.apache.activemq</groupId> <artifactId>activemq-spring</artifactId> <
version>${activemq.version}</version> </dependency> <dependency> <groupId>
org.apache.activemq</groupId> <artifactId>activemq-kahadb-store</artifactId> <
version>${activemq.version}</version> </dependency> <dependency> <groupId>
org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>
${activemq.version}</version> </dependency> <dependency> <groupId>
org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>
${activemq.version}</version> </dependency> <dependency> <groupId>
org.fusesource.hawtbuf</groupId> <artifactId>hawtbuf</artifactId> <version>1.11
</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</
groupId> <artifactId>geronimo-jms_1.1_spec</artifactId> <version>1.1.1</version>
</dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <
artifactId>geronimo-j2ee-management_1.1_spec</artifactId> <version>1.0.1</
version> </dependency> <!--activemq end--> </dependencies> <build> <finalName>
Demo3</finalName> <pluginManagement><!-- lock down plugins versions to avoid
using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <
artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin>
<!-- see
http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging
--> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</
version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <
version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</
artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>
maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <
artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin>
<plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version>
</plugin> </plugins> </pluginManagement> </build> </project>
重新启动Tomcat,查看控制台,果然现在的日志输出是我们想要的格式了。
热门工具 换一换