1. 程式人生 > >tomcat裏的幾類日誌: Catalina(catalina.out,catalina.log) localhost manager admin host-manager

tomcat裏的幾類日誌: Catalina(catalina.out,catalina.log) localhost manager admin host-manager

acc XML 表示 想要 current handler err pac logger

tomcat裏的幾類日誌: Catalina localhost manager host-manager access

前言:有時候我們會碰到代碼本地測試沒問題,然鵝發到生產卻出現了問題。這時候想解決問題,在本地測試沒多大效果的,最好的辦法是去生產上把日誌摟出來,根據異常日誌來排查問題,但是生產上那麽多日誌該如何下手呢?

項目中常用的三種日誌catalina.out catalina.log localhost.log

技術分享圖片
一般我們應該從catalina.out,catalina.log和localhost.log三類日誌著手。catalina.log和localhost.log是滾動生成的,後面接的有日期,格式可以是可以配的。配置在tomcat\conf下的logging.properties裏面。

catalina.out

catalina.out 是tomcat的標準輸出(stdout)和標準出錯(stderr),這是在tomcat的啟動腳本裏指定的,如果沒有修改的話stdout和stderr會重定向到這裏。所以我們在應用程序中使用System.out/err打印的東西都會到這裏來。另外,我們所有輸出到控制臺的日誌也會記錄進來。比如我們常用的log4j,當我們配置log4j.appender.stdout=org.apache.log4j.ConsoleAppender時,所有輸出到控制臺的log4j日誌也會記錄到Catalina.out中。所以一般情況下ConsoleAppender的日誌級別需要配高一點,不然Catalina.out會顯得特別臃腫,查找信息時也不太方便。比如測試的時候我一般用DEBUG級別,發生產用ERROR級別。當然你也可以關掉它,只需設置:

java.util.logging.ConsoleHandler.level = OFF 

或者修改Tomcat\bin目錄下的catalina.sh

    if [ -z "$CATALINA_OUT" ] ; then
      CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
    修改為
    if [ -z "$CATALINA_OUT" ] ; then
      CATALINA_OUT=/dev/null
    這樣就不會生成catalina.out文件了

catalina.log和localhost.log

在Tomcat的conf目錄下可以找到logging.properties文件,裏面配置了catalina.log和localhost.log相關的信息.默認情況下,啟動腳本裏指定了java.util.logging.config.file和java.util.logging.manager兩個變量。一個典型的logging.properties可能如下所示:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.logs}
1catalina.org.apache.juli.FileHandler.prefix = catalina.log.
1catalina.org.apache.juli.FileHandler.suffix = 
1catalina.org.apache.juli.FileHandler.formatter = com.taobao.tomcat.juli.SimpleFormatter

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.logs}
2localhost.org.apache.juli.FileHandler.prefix = localhost.log.
2localhost.org.apache.juli.FileHandler.suffix =
2localhost.org.apache.juli.FileHandler.formatter = com.taobao.tomcat.juli.SimpleFormatter

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = com.taobao.tomcat.juli.SimpleFormatter

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler

這個文件中directory表示日誌生成地址,prefix是日誌名前綴,suffix是日誌名後綴,formatter是日誌的格式化輸出,level表示日誌級別。而這裏的catalina按照配置對應的是catalina.log.{yyyy-MM-dd},這裏的console最終會輸出到catalina.out。這就是我們看到catalina.log.{yyyy-MM-dd}和catalina.out的日誌很多都是一樣的原因。

所有logname或parent logname為org.apache.catalina.core.ContainerBase.[Catalina].[localhost]的都會輸出到localhost.log.{yyyy-MM-dd}文件。而這個logname又代表著什麽呢?在tomcat中有一個server.xml的配置文件,其中有這麽一個片段:

<Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
        resourceName="UserDatabase"/>
    </Realm>
    <Host name="localhost" appBase="webapps" unpackWARs="false"
        autoDeploy="false">
    </Host> 
</Engine>

我們可以這麽簡單的理解: 一個Tomcat進程對應著一個Engine,一個Engine下可以有多個Host(Virtual Host),一個Host裏可以有多個Context,比如我們常常將應用部署在ROOT下還是webapps裏其他目錄,這個就是Context。

這其中Engine對應著tomcat裏的StandardEngine類,Host對應著StandardHost類,而Context對應著StandardContext。這幾個類都是從ContainerBase派生。這些類裏打的一些跟應用代碼相關的日誌都是使用ContainerBase裏的getLogger,而這個這個logger的logger name就是: org.apache.catalina.core.ContainerBase.[current container name].[current container name]...

而我們一個webapp裏listener, filter, servlet的初始化就是在StandardContext裏進行的,比如ROOT裏有一個listener初始化出異常了,打印日誌則logger name是org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/]。這其中Catalina和localhost是上面xml片段裏的Engine和Host的name,而[/]是ROOT對應的StandardContext的name。所以listener, filter, servlet初始化時的日誌是需要看localhost.{yyyy-MM-dd}.log這個日誌的。比如現在我們使用Spring,Spring的初始化我們往往是使用Spring提供的一個listener進行的,而如果Spring初始化時因為某個bean初始化失敗,導致整個應用沒有啟動,這個時候的異常日誌是輸出到localhost中的,而不是cataina.out中。所以有的時候我們應用無法啟動了,然後找catalina.out日誌,但最後也沒有定位根本原因是什麽,就是因為我們找的日誌不對。但有的時候catalina.out裏也有我們想要的日誌,那是因為我們的應用或使用的一些組件自己捕獲了異常,然後將其打印了,這個時候如果恰好這些日誌被我們配置成輸出到console,則這些日誌也會在catalina.out裏出現了。

manager.log和 host-manager.log

這幾種日誌用的比較少,如果需要的化可以這樣配置:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler,
3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.

4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler

localhost_access_log

該日誌可在Tomcat\conf的server.xml裏Host標簽裏面配置

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; [%{postdata}r] %s %{Referer}i %{User-Agent}i %T %b" />

可以利用這個日誌查詢訪問最耗時的接口

總結

catalina.out即標準輸出和標準出錯,這裏包含tomcat運行自己輸出的日誌以及程序向控制臺輸出的日誌,一般程序錯誤我們都能在這裏面找到。
catalina.log是tomcat自己運行的一些日誌,這些日誌還會輸出到catalina.out,但是應用向控制臺輸出的日誌不會輸出到catalina.log裏。
localhost.log主要是應用初始化(listener, filter, servlet)未處理的異常最後被tomcat捕獲而輸出的日誌,而這些未處理異常最終會導致應用無法啟動。

一般情況下Catalina.out文件是比較大的,可能幾百兆甚至幾十G,對於查找問題特別不方便,所以我們可以將ConsoleAppender的日誌級別直接配成ERROR級,或者單獨配個appender來記錄ERROR日誌,以便有問題時我們可以迅速查找對應日誌。

tomcat裏的幾類日誌: Catalina(catalina.out,catalina.log) localhost manager admin host-manager