JDK 所提供的默認(rèn) java.util.logging 實(shí)現(xiàn)功能太過局限,所以根本沒有什么使用價值。其關(guān)鍵局限在于不能實(shí)現(xiàn)針對每一應(yīng)用進(jìn)行日志記錄,因?yàn)榕渲檬轻槍γ恳?VM 的。所以按照默認(rèn)配置,Tomcat 會用 JULI 這種非常適用于容器的實(shí)現(xiàn)來代替默認(rèn)的 LogManager 實(shí)現(xiàn),從而避免了 LogManager 的缺點(diǎn)。
跟標(biāo)準(zhǔn) JDK 的 java.util.logging 一樣,JULI 也支持同樣的配置機(jī)制,或者使用編程方式,或者指定屬性值。它與 java.util.logging 的不同在于,它可以分別設(shè)置每一個類加載器屬性文件(能夠啟用簡單的、便于重新部署的應(yīng)用配置),屬性文件還支持?jǐn)U展構(gòu)造,能夠更加自由地定義 handle 并將其指定給 logger。
JULI 是默認(rèn)啟用的,除了普通的全局 java.util.logging 配置之外,它支持每個類加載器配置。這意味著可以在下列層級來配置日志:
JRE 中默認(rèn)的 logging.properties 指定了 ConsoleHandler,用于將日志輸出至 System.err。Tomcat 中默認(rèn)的 conf/logging.properties 也添加了幾個能夠?qū)懭胛募?nbsp;FileHandlers。
handler 的日志級別容差值默認(rèn)為 INFO,取值范圍為:SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINEST 或 ALL。你也可以從特殊的包中收集日志,然后為這種日志指定相應(yīng)的級別。
為了啟用 部分 Tomcat 內(nèi)部的調(diào)試日志功能,應(yīng)該配置適合的 logger 和 handle 來使用 FINEST 或 ALL 級別。比如:
org.apache.catalina.session.level=ALLjava.util.logging.ConsoleHandler.level=ALL
當(dāng)啟用調(diào)試日志功能時,建議將范圍盡量縮小,因?yàn)樵摴δ軙a(chǎn)生大量信息。
JULI 所使用的配置與純 java.util.logging 所支持的配置基本相同,只不過使用了一些擴(kuò)展,以便更靈活地配置 logger 和 handler。主要的差別在于:
還有一些額外的實(shí)現(xiàn)類,它們可以與 Java 所提供的類一起使用。在這些類中,最著名的就是 org.apache.juli.FileHandler。
org.apache.juli.FileHandler 支持日志緩存。日志緩存默認(rèn)是沒有啟用的。使用 handler 的 bufferSize 屬性可以配置它:屬性值為 0 時,代表使用系統(tǒng)默認(rèn)的緩存(通常使用 8k 緩存);屬性值小于 0 時,將在每個日志寫入上強(qiáng)制使用 writer flush(將緩存區(qū)中的數(shù)據(jù)強(qiáng)制寫出到系統(tǒng)輸出)功能;屬性值大于 0 時,則使用帶有定義值的 BufferedOutputStream 類——但要注意的是,這也將應(yīng)用于系統(tǒng)默認(rèn)的緩存。
以下是一個 $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 應(yīng)用的 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
查看下列資源獲取額外的詳細(xì)信息:
可能需要注意以下方面: