簡單介紹Tomcat中catalina.out 和 catalina.log的區別和用途
導讀 |
本文主要介紹了Tomcat中catalina.out 和 catalina.log的區別和用途詳解,文中透過示例程式碼介紹的非常詳細,具有一定的參考價值,感興趣的小夥伴們可以參考一下
|
catalina.out其實是tomcat的標準輸出(stdout)和標準出錯(stderr),這是在tomcat的啟動 裡指定的,如果沒有修改的話stdout和stderr會重定向到這裡。所以我們在應用裡使用System.out列印的東西都會到這裡來。另外,如果我們在應用裡使用其他的日誌框架,配置了向Console輸出的,則也會在這裡出現。比如以logback為例,如果配置ch.qos.logback.core.ConsoleAppender則會輸出到catalina.out裡。
這兩個日誌都是透過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的配置檔案,其中有這麼一個片段:
< Engine name="Catalina" defaultHost="localhost" > < Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" > < /Host>
我們可以這麼簡單的理解: 一個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。
一般是用log4j按照業務劃分,對一些比較重要的業務會單獨打到一個檔案,方便容易定位問題,,其他的預設會打到catalina。
到此這篇關於Tomcat中catalina.out 和 catalina.log的區別和用途詳解的文章就介紹到這了
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2871317/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Tomcat 中 catalina.out、catalina.log、localhost.log 和 access_log 的區別Tomcatlocalhost
- Python3中_和__的用途和區別Python
- ssr、ss和vpn介紹和區別
- PHP 中 include 和 require 的概要及區別介紹PHPUI
- FTP和TFTP的區別與介紹FTP
- 簡單介紹HTTP與HTTPS之間的區別HTTP
- ARouter簡單入門和介紹
- python 中的迭代器和生成器簡單介紹Python
- NTFS和FAT32區別介紹
- jar包和war包的介紹與區別JAR
- gpu是什麼 gpu和cpu的區別介紹GPU
- 在Linux中,tomcat和nginx的區別是什麼?LinuxTomcatNginx
- snap和apt的區別簡單瞭解[]APT
- HTTP介紹和HTML簡介HTTPHTML
- 簡單介紹Rust中的workspaceRust
- 簡單的介紹伺服器和Ajax的應用伺服器
- 簡單介紹python迭代器和生成器Python
- jar包、war包和ear包的介紹與區別JAR
- epic和steam的區別介紹及優劣對比
- 微服務技術棧簡單介紹,Eureka和Ribbon的引入和使用微服務
- mitmproxy中libmproxy簡單介紹MITIBM
- [轉]Oracle資料庫ASH和AWR的簡單介紹Oracle資料庫
- SurfaceView和普通view的區別及簡單使用View
- Java中抽象類和介面的介紹及二者間的區別Java抽象
- cpu散片和盒裝的區別是什麼 amdintelcpu散片和盒裝區別介紹Intel
- 簡單介紹java中的equals()方法Java
- Nginx/Tomcat/Apache的優缺點和區別NginxTomcatApache
- 蜂窩基站和訊號放大器的區別介紹
- 雲伺服器和物理伺服器的區別介紹伺服器
- jpg和jpeg有什麼區別 電子照片圖片格式jpg和jpeg區別介紹
- 簡單介紹Go 中的空白識別符號下劃線Go符號
- MySQL儲存引擎簡介及MyISAM和InnoDB的區別MySql儲存引擎
- 對GaussDB資料庫和資料管理的簡單介紹資料庫
- 簡單介紹python連線telnet和ssh的兩種方式Python
- 簡單易懂的 Go 泛型使用和實現原理介紹Go泛型
- Webpack 的簡單介紹Web
- AOP的簡單介紹
- 簡單介紹下python2.x與python3.x的區別Python