我们在开发的时候通常会遇到再同一个服务器下开发多个应用的情况,在公共jar包统一加载的情况下,如果log4j.properties配置不当,经常会发生多个应用的log日志都打印到一个文件里了,如果配置文件配置的是输出所有log打印,那么web应用的加载顺序就是导致这个问题的根本原因,由于配置tomcat加载web应用的顺序是一件比较繁琐的事情,除非各个应用有强依赖关系,否则一般不建议去配置加载顺序;这样就会导致后加载的应用对log4j的配置覆盖了之前应用的配置,最终所有log输出都会出现在最后加载的应用所配置的log文件;
那么知道的原因之后,我们就可以寻找相应的解决方法了,这里仅提供两种作者觉得比较简单且实用的方法;
第一种:将log4j的jar包移除统一加载的lib库,放入单独应用中各自加载,这样就不会发生配置覆盖的情况;
第二种:在log4j.properties配置category属性,该属性可以理解为根类过滤参数,还是实例说明吧,比如你做如下设置
### set log levels ###
log4j.rootLogger = INFO
### 输出到控制台 ###
<span style="background-color: rgb(255, 0, 0);">log4j.category.com = INFO, console </span>
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
### 云平台INFO ###
<span style="background-color: rgb(255, 0, 0);">log4j.category.com.test.cloud = INFO, LOG_TESTCLOUD</span>
log4j.appender.LOG_TESTCLOUD = org.apache.log4j.RollingFileAppender
log4j.appender.LOG_TESTCLOUD .File = /logs/TestCloud/TestCloud.log
log4j.appender.LOG_TESTCLOUD .MaxFileSize = 500KB
log4j.appender.LOG_TESTCLOUD .MaxBackupIndex = 10
log4j.appender.LOG_TESTCLOUD .layout = org.apache.log4j.PatternLayout
log4j.appender.LOG_TESTCLOUD .layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} 注意红色标记部分即是设置category属性,经过上述设置之后,所有在com之下的子包(子类)所打印的log都将输出到控制台,所有在com.test.cloud之下的子包(子类)所打印的log信息,都将写入/logs/TestCloud/TestCloud.log文件;
所以建议不同web应用都要有不同的根包名,以便进行过滤;
当多个应用在同一个tomcat服务器下运行,若共用log4j.jar,可能会导致日志冲突。加载顺序决定配置覆盖,不建议调整加载顺序。解决方法包括:1) 将log4j.jar移出公共库,每个应用独立加载;2) 在log4j.properties中设置category属性,根据应用包名过滤日志输出,确保不同应用日志分开记录。

168

被折叠的 条评论
为什么被折叠?



