JDK 所提供的默認 java.util.logging 實現功能太過局限,所以根本沒有什么使用價值。其關鍵局限在于不能實現針對每一應用進行日志記錄,因為配置是針對每一 VM 的。所以按照默認配置,Tomcat 會用 JULI 這種非常適用于容器的實現來代替默認的 LogManager 實現,從而避免了 LogManager 的缺點。
跟標準 JDK 的 java.util.logging 一樣,JULI 也支持同樣的配置機制,或者使用編程方式,或者指定屬性值。它與 java.util.logging 的不同在于,它可以分別設置每一個類加載器屬性文件(能夠啟用簡單的、便于重新部署的應用配置),屬性文件還支持擴展構造,能夠更加自由地定義 handle 并將其指定給 logger。
JULI 是默認啟用的,除了普通的全局 java.util.logging 配置之外,它支持每個類加載器配置。這意味著可以在下列層級來配置日志:
JRE 中默認的 logging.properties 指定了 ConsoleHandler,用于將日志輸出至 System.err。Tomcat 中默認的 conf/logging.properties 也添加了幾個能夠寫入文件的 FileHandlers。
handler 的日志級別容差值默認為 INFO,取值范圍為:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL。你也可以從特殊的包中收集日志,然后為這種日志指定相應的級別。
為了啟用 部分 Tomcat 內部的調試日志功能,應該配置適合的 logger 和 handle 來使用 FINEST 或 ALL 級別。比如:
org.apache.catalina.session.level=ALLjava.util.logging.ConsoleHandler.level=ALL
當啟用調試日志功能時,建議將范圍盡量縮小,因為該功能會產生大量信息。
JULI 所使用的配置與純 java.util.logging 所支持的配置基本相同,只不過使用了一些擴展,以便更靈活地配置 logger 和 handler。主要的差別在于:
還有一些額外的實現類,它們可以與 Java 所提供的類一起使用。在這些類中,最著名的就是 org.apache.juli.FileHandler。
org.apache.juli.FileHandler 支持日志緩存。日志緩存默認是沒有啟用的。使用 handler 的 bufferSize 屬性可以配置它:屬性值為 0 時,代表使用系統默認的緩存(通常使用 8k 緩存);屬性值小于 0 時,將在每個日志寫入上強制使用 writer flush(將緩存區中的數據強制寫出到系統輸出)功能;屬性值大于 0 時,則使用帶有定義值的 BufferedOutputStream 類——但要注意的是,這也將應用于系統默認的緩存。
以下是一個 $CATALINA_BASE/conf 中的 logging.properties 文件:
handlers = 1catalina.org.apache.juli.FileHandler, \
2localhost.org.apache.juli.FileHandler, \
3manager.org.apache.juli.FileHandler, \
java.util.logging.ConsoleHandler
.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################# Handler specific properties.# Describes specific configuration info for Handlers.############################################################
1catalina.org.apache.juli.FileHandler.level = FINE1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs1catalina.org.apache.juli.FileHandler.prefix = catalina.
2localhost.org.apache.juli.FileHandler.level = FINE2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs2localhost.org.apache.juli.FileHandler.prefix = localhost.
3manager.org.apache.juli.FileHandler.level = FINE3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs3manager.org.apache.juli.FileHandler.prefix = manager.3manager.org.apache.juli.FileHandler.bufferSize = 16384
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
############################################################# Facility specific properties.# Provides extra control for each logger.############################################################
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = \
2localhost.org.apache.juli.FileHandler
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = \
3manager.org.apache.juli.FileHandler
# 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
下例是一個用于 servlet-examples 應用的 WEB-INF/classes 中的 logging.properties 文件:
handlers = org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
############################################################# Handler specific properties.# Describes specific configuration info for Handlers.############################################################
org.apache.juli.FileHandler.level = FINE
org.apache.juli.FileHandler.directory = ${catalina.base}/logs
org.apache.juli.FileHandler.prefix = ${classloader.webappName}.
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
查看下列資源獲取額外的詳細信息:
可能需要注意以下方面: