1. 程式人生 > >Tomcat - 怎麼控制某個類或者包下的日誌列印級別

Tomcat - 怎麼控制某個類或者包下的日誌列印級別

問題與分析

Tomcat是使用自己的日誌實現tomcat-juli.jar來列印日誌資訊的,日誌會被列印到catalina.out裡,除去你在專案裡自己使用的日誌框架外,由System.outSystem.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

參考連結