標籤:

catalina.out與localhost.log與manager.log?

linux中的Tomcat日誌


題主,以下是我在公眾號曾發過的一篇內容,分享到這裡。Tomcat的日誌默認使用JDK的Log,單獨提供了自定義的logging.properties文件,在這個文件里指定了不同的應用的日誌級別等。同時提供了Console和File兩種格式的日誌輸出。

-----------------------

啟動Tomcat後,總能看著Console里輸出的內容嘩嘩的閃過,一行行...

有些時候,他們又如同流星,在你打開Console的一瞬間,消失了...

這些Log是怎麼被定義的,從哪裡來,又到了哪裡?坐在電腦前,我不禁陷入深深的思考...

首先,注意到的現象是:

  • 我們在應用內的System.out/System.err這些輸出,也都出現在了Console中

  • 同時Tomcat的Console中的輸出,在日誌文件中也有一份一樣的內容

這個是如何做到的呢?

在說這個之前,需要先了解下JDK提供的Log實現,而Tomcat是在此基礎之上做的改動。

JDK的實現

我們在Java類中如果要直接使用Log,一般除System.out、System.err之外,都會這樣使用:

private Logger logger = Logger.getLogger("log");

logger.info("test");

這一過程,不依賴任何第三方的JAR,是基於JDK的實現。因此,整個Log都輸出到了Console中。而對比Tomcat的輸出,我們的內容並沒有輸出到文件中。

這是由於JDK的內部,默認提供了關於Log的配置文件,文件位於

JAVA_HOME/jre/lib/logging.properties

我們看到,最上面就聲明了關於Log的處理類handler --- ConsoleHandler,用於輸出到命令行中。

為了支持同時輸出到文件中,我們可以手動在handlers後面增加關於文件的處理:

java.util.logging.FileHandler

增加這一配置後,默認關於文件格式的配置也開始生效:

windows系統下,會生成如下文件

C:Users用戶名java1.log

文件名中的1是配置中%u 生成的一個變化的數字。

文件生成的格式根據formatter指定,默認是XML格式。

Tomcat實現

Tomcat內部的日誌實現,是使用JULI,是apache commons logging改名後的一個項目。

Tomcat中為了增加自定義的Log配置,同時不影響其它使用JDK中的Log的應用,所以指定了自定義的logger配置文件,這一過程中通過是啟動腳本

catalina.bat中增加參數的實現的,參數主要有如下兩個:

  • LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%conflogging.properties"

  • LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

即啟動參數中包含兩個-D參數 java.util.logging.config.file,java.util.logging.manager。

而Tomcat自定義的log配置文件中,

我們看到,Tomcat中默認就支持文件和Console兩種Log的輸出。

同時handler的類名中包含一些1、2這些,這在JDK的配置文件中是不合法的,而Tomcat使用自定義的classLoader,來解析這種定義的prefix,增加prefix是為了一個handler的class可以生成多個實例。

Tomcat內log文件的命名,是根據配置文件中的邏輯,前綴是catalina,後面則是由FileHandler的邏輯控制,代碼如下:

// Open the current log file
writerLock.writeLock().lock();
File pathname = new File(dir.getAbsoluteFile(), prefix
+ (rotatable ? date : "") + suffix);
File parent = pathname.getParentFile();

所以,整個log文件在自動輪轉時,最終是catalina+日期.log,不輪轉則一直是

catalina.log。

而上面提到的Console和日誌中,同時都記錄了System.out/System.err的信息,這個,是通過將out、err的輸出流重定向到日誌文件中實現的。

下一篇文章,將會分析整個Logger的內部結構,以及執行邏輯等,歡迎關注。

掃描二維碼,關注我!QQ群:96437267


轉載自: tomcat中的幾種log http://www.10tiao.com/html/240/201705/2649257445/1.html

題主可以看看 說的還是不錯的

以下是轉載原文:

============================================================

日誌是程序員居家旅行必備,哦不對,是定位問題,修復bug,甚至是驗證應用是否正常的必備利器。甚至很多時候,我們做一次部署僅僅是為了加一行log。雖然現在有各種各樣的問題診斷工具,但是在定位線上問題時,我們很多時候還是希望有列印良好的log。

列印良好的log很重要,但是知道我們需要的log在哪裡也很重要。因為各種各樣的原因,我們經常會將log打到不同的文件中,這樣就導致了出問題找幾個日誌文件的情況。

這不,默認情況下tomcat就會生成幾個日誌文件:catalina.out, catalina.{yyyy-MM-dd}.log, localhost.{yyyy-MM-dd}.log。(嗯,這裡說的是默認情況下,這些都是可以配置修改的)。

這幾個不同的日誌文件里的內容也不盡相同,查問題也要看不同的日誌文件,如果沒找到文件,甚至都無法了解真正的問題是什麼。

我們先來看看這幾個日誌都是怎麼產生的,然後來了解一下什麼樣子的東西會出現在哪個日誌文件。

catalina.out

catalina.out其實是tomcat的標準輸出(stdout)和標準出錯(stderr),這是在tomcat的啟動腳本里指定的,如果沒有修改的話stdout和stderr會重定向到這裡。所以我們在應用里使用System.out列印的東西都會到這裡來。另外,如果我們在應用里使用其他的日誌框架,配置了向Console輸出的,則也會在這裡出現。比如以logback為例,如果配置ch.qos.logback.core.ConsoleAppender則會輸出到catalina.out里。

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日誌的同學。嗯,可以和運維商量一下。


推薦閱讀:

直接優化JVM 和 Tomcat JVM(修改catalina.sh)優化有什麼區別?
tomcat運行久了,需要重新啟動,才能接收客戶端請求,但是靜態資源可以訪問,怎麼解決?
web項目上線之前需要注意什麼問題?
什麼樣的項目才會考慮使用JBoss、WebSphere、WebLogic等伺服器?
adt-bundle-windows沒有集成tomcat,如何配置tomcat伺服器?網上的教程大多很古老不適用。

TAG:ApacheTomcat |