本文主要講的是 Tomcat 本身自己對日誌的處理,而非每一個 webapp 的日誌配置(如今 webapp 通常會獨立配置日誌)。
內容基本上來自官方文檔:http://tomcat.apache.org/tomcat-6.0-doc/logging.htmlhtml
1、Webapp 記錄日誌的方法
Tomcat 中的 webapp 有三種方法記錄日誌:java
- 使用 java.util.logging
- 使用 Servlet 標準中的日誌記錄方法 javax.servlet.ServletContext.log(...)
- 使用任意其它的日誌框架(例如 Log4j)
通常來講,每一個 webapp 使用的日誌框架都是獨立的,不會影響其餘 webapp。但若是用的是 Java 原生的 java.util.logging,因爲它是經過系統加載的,所以各個 webapp 之間會共享同一個日誌配置。web
2、什麼是 JULI
Tomcat 默認會使用 java.util.logging (JUL) 日誌框架,但重寫了一些實現,以解決一個 JVM 中 JUL 只能使用一個配置文件的問題,知足多個 webapp 獨立配置日誌的需求。這個實現就叫 JULI (['d?u:li])。apache
全局日誌配置tomcat
- 默認使用 ${catalina.base}/conf/logging.properties,這個路徑在 Tomcat 啓動腳本中經過 java.util.logging.config.file 系統屬性指定
- 若是上述默認配置文件不可用(不存在或無權限讀取),則使用 JRE 中的 ${java.home}/lib/logging.properties
webapp 獨立日誌配置app
- JULI 支持每一個 ClassLoader (也就是每一個 webapp) 使用本身的日誌配置,配置文件位於 {webapp]/WEB-INF/classes/logging.properties
控制檯框架
- 在 Linux 上運行 Tomcat 時,控制檯的輸出 (System.err/out) 同時會被保存到文件 catalina.out 中,這個名稱是經過運行腳本指定的
- 在 Windows 上,若是以服務的形式運行 Tomcat,也會將控制檯輸出保存到文件(文檔沒說文件名是什麼。。。),若是不以服務的形式運行,則不會保存控制檯輸出
3、JULI 對 JUL 的擴展
- 配置文件中能經過 ${systemPropertyName} 的格式使用系統屬性
- Handler
- JUL 中,handler 名稱即爲類的完整限定名,一個類只能建立一個 handler。而 JULI 的 handler 名稱能夠在類的完整限定名以前加前綴,該前綴以數字開頭,以 . 結尾(注意中間不能出現 .),例如 5portallocal.
- JULI 定義一些 handler 類,例如 org.apache.juli.FileHandler,支持緩衝。
- Logger
- 每一個 logger 能夠指定多個 handler(Java 6 的 JUL 開始支持)
- root logger 可使用 .handler 指定 handler:
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].useParentHandlers = true
- 注意,若是一個 logger 已經指定了 handler,則默認不會將日誌傳遞給上級 logger,但能夠經過 useParentHandlers 修
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].useParentHandlers = true
4、生產環境中的注意事項
5、其它
Tomcat 也能配置爲使用 Log4j 代替 JULI 來處理日誌,詳見 http://tomcat.apache.org/tomcat-6.0-doc/logging.html#Using_Log4jwebapp