Tomcat - 怎麼控制某個類或者包下的日誌列印級別
問題與分析
Tomcat是使用自己的日誌實現tomcat-juli.jar
來列印日誌資訊的,日誌會被列印到catalina.out裡,除去你在專案裡自己使用的日誌框架外,由System.out
,System.err
或者printStackTrace()
打印出來的資訊則是會被輸入到catalina.out裡,如果引用的jar包裡也有這些語句也會一起輸入到catalina.out裡。
比如現在catalina.out裡有大量的NotSerializableException,這個exception是由第三方jar包打印出來的,log日誌如下:
javade.javakaffee.web.msm.JavaSerializationTranscoder.level = SEVERE 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
檔案,找到如下注釋(一般在最末尾):
# 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
在這裡的末尾加上一行:
de.javakaffee.web.msm.JavaSerializationTranscoder.level = SEVERE
因為這個未序列化異常是在這個類中被打印出來的,而且log級別是warning;對於Tomcat來說,日誌級別如下所示:
SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)
我們需要將level設定成SEVERE,才可以不讓其列印NotSerializableException出來。你甚至可以將範圍進行擴大,變成如下配置:
de.javakaffee.web.msm.level = SEVERE
指定de.javakaffee.web.msm
包下的類只打印SEVERE級別的日誌資訊。
補充
- 如果希望不列印日誌資訊,可以將level設定為
OFF
。 - 如果希望列印全部的日誌資訊,可以將level設定為
ALL
。