本文主要講的是 Tom
cat 自己本身對日志的處理,而非每個 webapp 的日志配置(現在 webapp 一般會獨立配置日志)。
內容基本上來自官方文檔:http://tomcat.apache.org/tomcat-6.0-doc/logging.html
一、Webapp 記錄日志的方法
Tomcat 中的 webapp 有三種方法記錄日志:
-
使用 java.util.logging
-
使用 Servlet 標准中的日志記錄方法 javax.servlet.ServletContext.log(...)
-
使用任意其它的日志框架(例如 Log4j)
一般來說,每個 webapp 使用的日志框架都是獨立的,不會影響其他 webapp。但如果用的是 Java 原生的 java.util.logging,由於它是通過系統加載的,因此各個 webapp 之間會共享同一個日志配置。
二、什麼是 JULI
Tomcat 默認會使用 java.util.logging (JUL) 日志框架,但重寫了一些實現,以解決一個 JVM 中 JUL 只能使用一個配置文件的問題,滿足多個 webapp 獨立配置日志的需求。這個實現就叫 JULI (['d?u:li])。
全局日志配置
-
默認使用 ${catalina.base}/conf/logging.properties,這個路徑在 Tomcat 啟動腳本中通過 java.util.logging.config.file 系統屬性指定
-
如果上述默認配置文件不可用(不存在或無權限讀取),則使用 JRE 中的 ${java.home}/lib/logging.properties
webapp 獨立日志配置
-
JULI 支持每個 ClassLoader (也就是每個 webapp) 使用自己的日志配置,配置文件位於 {webapp]/WEB-INF/classes/logging.properties
控制台
-
在 Linux 上運行 Tomcat 時,控制台的輸出 (System.err/out) 同時會被保存到文件 catalina.out 中,這個名稱是通過運行腳本指定的
-
在 Windows 上,如果以服務的形式運行 Tomcat,也會將控制台輸出保存到文件(文檔沒說文件名是什麼。。。),如果不以服務的形式運行,則不會保存控制台輸出
三、JULI 對 JUL 的擴展
-
配置文件中能通過 ${systemPropertyName} 的格式使用系統屬性
-
Handler
-
JUL 中,handler 名稱即為類的完整限定名,一個類只能創建一個 handler。而 JULI 的 handler 名稱可以在類的完整限定名之前加前綴,該前綴以數字開頭,以 . 結尾(注意中間不能出現 .),例如 5portallocal.
-
JULI 定義一些 handler 類,例如 org.apache.juli.FileHandler,支持緩沖。
-
Logger
四、生產環境中的注意事項
-
root logger 默認配置了 FileHandler 和 ConsoleHandler,而控制台輸出一般又被保存到文件中,導致相同的日志被保存了2份,可以考慮將 ConsoleHandler 從 root logger 中去除。
-
刪除沒必要的 handler,例如 host-manager 的。
-
handler 默認使用系統默認編碼,可以考慮顯式指定編碼。
-
考慮配置 access log,可參考 http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html#Access_Log_Valve
五、其它
Tomcat 也能配置為使用 Log4j 代替 JULI 來處理日志,詳見 http://tomcat.apache.org/tomcat-6.0-doc/logging.html#Using_Log4j