问题与分析:Tomcat使用tomcat-juli.jar实现日志打印,将日志输出到catalina.out。除项目中使用的日志框架外,System.out、System.err或printStackTrace()输出的信息也会被写入catalina.out。如果引用的jar包中也有这些语句,它们也会一起写入catalina.out。例如,现在catalina.out中有大量NotSerializableException,这个异常是由第三方jar包打印的,日志记录如下:
```java
30-Oct-2018 17:53:58.368 WARNING [msm-storage-thread-1] de.javakaffee.web.msm.JavaSerializationTranscoder.writeAttributes Cannot serialize session attribute [javax.zkoss.zk.ui.Session] for session [EB56FE915F0611E8195FF5F95C96A9E2.app2]
java.io.NotSerializableException: org.zkoss.bind.tracker.impl.BindUiLifeCycle
```
可以看到,这个异常是由Memcached在共享session时由于存在未序列化的对象而打印出来的。现在我们希望在catalina.out中不再看到这个异常,可以通过配置logging.properties来隐藏它。
解决方法:在Tomcat的安装目录下找到conf\logging.properties文件,找到如下注释(一般在最末尾):
```java
# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE
```
在这里的末尾加上一行:
```java
org.apache.catalina=OFF
```
保存文件并重启Tomcat。这样就可以在catalina.out中隐藏掉这个异常了。
将de.javakaffee.web.msm.JavaSerializationTranscoder.level设置为SEVERE,可以避免在Tomcat中打印NotSerializableException。你甚至可以将范围扩大,只打印SEVERE级别的日志信息。具体操作如下:
1. 打开log4j2.xml配置文件;
2. 在
```xml
```
这将指定de.javakaffee.web.msm包下的类只打印SEVERE级别的日志信息。
补充:
- 如果希望不打印日志信息,可以将level设置为OFF;
- 如果希望打印全部的日志信息,可以将level设置为ALL。