tomcat中的几种log catalina localhost
2019獨角獸企業重金招聘Python工程師標準>>>
體會
catalina.out catalina.log
是tomcat的標準輸出(stdout)和標準出錯(stderr)
cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log
是通過logging.properties配置的tomcat自己運行的一些日志, catalina.log 是tomcat自己運行的一些日志
localhost.{yyyy-MM-dd}.log
主要是應用初始化(listener, filter, servlet)未處理的異常最后被tomcat捕獲而輸出的日志 日志是程序員居家旅行必備,哦不對,是定位問題,修復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日志的同學。
嗯,可以和運維商量一下。?
Tomcat日志、項目中的log4j日志、控制臺——我的日志最后到底跑哪去了?
1、Tomcat自帶日志功能,即時你的項目中有log4j也不會影響到Tomcat自己記錄日志。
2、你的項目中的log4j中的日志指定打印到什么地方(控制臺或者文件),便會打印到什么地方,和Tomat日志無關。
——如果你項目中的log4j指定打印到控制臺,并且你開啟的tomcat有控制臺,那么這個時候你可以在控制臺觀察到日志。
——如果你用log4j來處理了Tomcat的日志(具體需要你自己配置tomcat的配置文件),那么Tomcat便會使用log4j來打印,但是這和你項目中的log4j仍然不是同一個log4j。
3、關于異常日志的打印
如果你在你的項目中處理了某個異常:
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配置文件中,看看里面寫的要把這條錯誤信息打印在哪。
——如果是打印到控制臺,那么就去控制臺找。如果沒有控制臺,那么這個錯誤信息也就丟了。
——如果是寫入某個文件,那當然就是在你的文件中了。
?
4、控制臺
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
轉載于:https://my.oschina.net/newchaos/blog/2186596
總結
以上是生活随笔為你收集整理的tomcat中的几种log catalina localhost的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水滴众筹的面试题
- 下一篇: “正则表达式”应当称为“规则表达式”