最近负责一个应用,所有的日志都打入了tomcat_stdout.log里面了,由于业务打点日志太多,导致日志打入一个文件超过20G,这时候由于没有log框架里面log文件分离,当日志打满之后,刷磁盘的时候内存就吃紧,系统告警信息严重影响我们生活了,必须得查了。
应用属于WebX应用,WebX的日志系统一般是log4j或者是logback。之前是配置好的log4j日志怎么就突然不能正常打日志了呢?
首先从WebX配置的标准的log4j入手,WebX配置log4j的依赖如下:
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> <scope>runtime</scope> </dependency> </dependencies> </dependencyManagement>并且WebX系统里面需要指定日志系统,当然log4j和logback的日志框架都会配置的日志系统,但是不显式配置就容易混乱,因此要用log4j的日志格式,就必须在web.xml里面配置配置的是log4j的日志系统:
<web-app> <context-param> <param-name>logSystem</param-name> <param-value>log4j, logback</param-value> </context-param> ... </web-app>到这里,应用启动后日志已经按照log4j.xml里面的日志文件生成了,但是日志却怎么也打不出来了!!!又一次陷入困境。
但是到这里就是一个通常能遇到的问题了,就是日志系统jar包冲突,或者直接debug到打log的地方,看他们加载了哪个日志框架实例!查看系统打包的文件,发现系统的lib目录下面的包如下:
--r-- 1 admin admin 8869 08-19 21:00 slf4j-log4j12-1.7.5.jar
-rw-r--r-- 1 admin admin 489884 08-19 21:00 log4j-1.2.17.jar
-rw-r--r-- 1 admin admin 4463 08-19 21:00 jul-to-slf4j-1.6.1.jar
-rw-r--r-- 1 admin admin 26084 08-19 21:00 slf4j-api-1.7.5.jar
-rw-r--r-- 1 admin admin 16517 08-19 21:00 jcl-over-slf4j-1.7.5.jar
-rw-r--r-- 1 admin admin 358085 08-19 21:00 jakarta.log4j-0.0.0.jar
-rw-r--r-- 1 admin admin 391834 08-19 21:00 log4j-1.2.15.jar
但是正常的log4j的配置jar包只需要:
-rw-r--r-- 1 admin admin 9753 07-16 10:30 slf4j-log4j12-1.6.1.jar
-rw-r--r-- 1 admin admin 391834 07-16 10:30 log4j-1.2.15.jar
-rw-r--r-- 1 admin admin 17308 07-16 10:29 jcl-over-slf4j-1.6.1.jar
-rw-r--r-- 1 admin admin 25496 07-16 10:30 slf4j-api-1.6.1.jar
-rw-r--r-- 1 admin admin 4463 07-16 10:30 jul-to-slf4j-1.6.1.jar
因此,可以推断,系统多加载的log4j-1.2.17.jar和jakarta.log4j-0.0.0.jar 可能是导致日志加载失败的原因,因此只需要pom依赖中排除一下就好了!
如果是WebX配置日志系统,可以参考宝宝的WebX文档:
http://openwebx.org/docs/logging.html#webx.logging.webxml