tomcat中的幾種log catalina localhost

體會html

catalina.out catalina.logjava

是tomcat的標準輸出(stdout)和標準出錯(stderr)程序員

cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.logweb

是經過logging.properties配置的tomcat本身運行的一些日誌, catalina.log 是tomcat本身運行的一些日誌apache

localhost.{yyyy-MM-dd}.logtomcat

主要是應用初始化(listener, filter, servlet)未處理的異常最後被tomcat捕獲而輸出的日誌 日誌是程序員居家旅行必備,哦不對,是定位問題,修復bug,甚至是驗證應用是否正常的必備利器。甚至不少時候,咱們作一次部署僅僅是爲了加一行log。雖然如今有各類各樣的問題診斷工具,可是在定位線上問題時,咱們不少時候仍是但願有打印良好的log。 打印良好的log很重要,可是知道咱們須要的log在哪裏也很重要。由於各類各樣的緣由,咱們常常會將log打到不一樣的文件中,這樣就致使了出問題找幾個日誌文件的狀況。 這不,默認狀況下tomcat就會生成幾個日誌文件:catalina.out, catalina.{yyyy-MM-dd}.log, localhost.{yyyy-MM-dd}.log。(嗯,這裏說的是默認狀況下,這些都是能夠配置修改的)。 這幾個不一樣的日誌文件裏的內容也不盡相同,查問題也要看不一樣的日誌文件,若是沒找到文件,甚至都沒法瞭解真正的問題是什麼。app

咱們先來看看這幾個日誌都是怎麼產生的,而後來了解一下什麼樣子的東西會出如今哪一個日誌文件。框架

catalina.out catalina.out實際上是tomcat的標準輸出(stdout)和標準出錯(stderr),這是在tomcat的啓動腳本里指定的,若是沒有修改的話stdout和stderr會重定向到這裏。因此咱們在應用裏使用System.out打印的東西都會到這裏來。運維

另外,若是咱們在應用裏使用其餘的日誌框架,配置了向Console輸出的,則也會在這裏出現。好比以logback爲例,若是配置ch.qos.logback.core.ConsoleAppender則會輸出到catalina.out裏。eclipse

cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log 這兩個日誌都是經過logging.properties配置的(默認狀況下,啓動腳本里指定了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 = INFO

1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE

2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs

2localhost.org.apache.juli.FileHandler.prefix = localhost.

java.util.logging.ConsoleHandler.level = INFO

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO

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

這個文件大體的意思是,root輸出到catalina和console。

而這裏的catalina按照配置對應的是catalina.{yyyy-MM-dd}.log,這裏的console最終會輸出到catalina.out。

這就是咱們看到catalina.{yyyy-MM-dd}.log和catalina.out的日誌不少都是同樣的緣由。

配置文件中還有一個localhost,全部logname或parent logname爲org.apache.catalina.core.ContainerBase.[Catalina].[localhost]的都會輸出到localhost.{yyyy-MM-dd}.log文件。

而這個logname又表明着什麼呢?在tomcat中有一個server.xml的配置文件,其中有這麼一個片斷:    

咱們能夠這麼簡單的理解: 一個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裏出現了。

總結

那麼總結起來,catalina.out即標準輸出和標準出錯,全部輸出到這兩個位置的都會進入catalina.out,這裏包含tomcat運行本身輸出的日誌以及應用裏向console輸出的日誌。

catalina.{yyyy-MM-dd}.log是tomcat本身運行的一些日誌,這些日誌還會輸出到catalina.out,可是應用向console輸出的日誌不會輸出到catalina.{yyyy-MM-dd}.log。

localhost.{yyyy-MM-dd}.log主要是應用初始化(listener, filter, servlet)未處理的異常最後被tomcat捕獲而輸出的日誌,而這些未處理異常最終會致使應用沒法啓動。

最後想一想,這裏分幾個日誌文件其實不利於問題查找,爲啥不乾脆都輸出到catalina.out裏呢?

我想tomcat做爲通用容器自己,可能考慮到Engine下有多個Host,每一個Host的日誌仍是要輸出到不一樣的文件。而實際中咱們每每是單容器,單Host,甚至是隻有一個ROOT的Context。

因此對於這種狀況,我以爲是能夠將全部日誌都輸出到catalina.out方便查問題,特別是那些還不知道初始化失敗應該去看localhost日誌的同窗。

嗯,能夠和運維商量一下。 

Tomcat日誌、項目中的log4j日誌、控制檯——個人日誌最後到底跑哪去了?

一、Tomcat自帶日誌功能,即時你的項目中有log4j也不會影響到Tomcat本身記錄日誌。

二、你的項目中的log4j中的日誌指定打印到什麼地方(控制檯或者文件),便會打印到什麼地方,和Tomat日誌無關。

——若是你項目中的log4j指定打印到控制檯,而且你開啓的tomcat有控制檯,那麼這個時候你能夠在控制檯觀察到日誌。

——若是你用log4j來處理了Tomcat的日誌(具體須要你本身配置tomcat的配置文件),那麼Tomcat便會使用log4j來打印,可是這和你項目中的log4j仍然不是同一個log4j。

三、關於異常日誌的打印

若是你在你的項目中處理了某個異常:

try {
            int i = 1/0;
        }catch(Exception e) {
            e.printStackTrace();
        }

  A、那麼這個異常信息會打印到你的控制檯。你說你沒有開控制檯,是用服務的形式跑的?那麼這個異常的信息你就看不見了。

  B、你在你的項目中直接throw的,而且沒有任何地方處理這個異常,那麼最後這個異常會被拋給你的容器——Tomcat,Tomcat這時會在localhost.日期.log文件中記錄這個異常。

  C、你使用的是log4j:

LogFactory.getLog(Logger.class).error("Thread:"+i+"-print:"+j+"-CurrentThread:"+Thread.currentThread());

  那麼你應該去看看你的log4j配置文件中,看看裏面寫的要把這條錯誤信息打印在哪。

  ——若是是打印到控制檯,那麼就去控制檯找。若是沒有控制檯,那麼這個錯誤信息也就丟了。

  ——若是是寫入某個文件,那固然就是在你的文件中了。

 

四、控制檯

Tomcat默認也會往控制檯輸出日誌,這部分日誌和其catalina.日期.log文件中記錄的是一致的。

程序中的syso、e.printStackTrace(),以及log4j若是配置的往控制檯輸出日誌,那麼他們所有都會出如今控制檯上,

別看你eclipse裏的控制檯上有那麼多日誌,你要搞清楚他們不是同一個日誌記錄器寫的。

 

禁用 catalina 日誌的輸出:

1catalina.org.apache.juli.FileHandler.level = OFF

 

tomcat參考文檔  http://wiki.jikexueyuan.com/project/tomcat/logging.html

相關文章
相關標籤/搜索