Tomcat日志與Log4j日志


 

 一:日志作用

  更好的調試,分析問題。

       普通的一個請求處理10秒鍾,日志10秒鍾,總共就得20秒鍾,這肯定是不行的,因為日志嚴重影響了性能。所以,我們就有必要了解日志的實現方式,以及它是如何降低IO的時間。

       java的有自己的日志輸出,tomcat也有自己的日志輸出,下面就讓我們簡單了解下,以便整理思路。

二:java日志的實現方式:

  1.可以使用JDK自帶的Log類,也可以使用其他的日志框架,如log4j,Slf4j等日志框架

常見java日志框架: Log4j Apache Log4j是一個基於Java的日志記錄工具。Log4j 是最常用的Java日志框架。 Log4j 2 Apache Log4j 2是apache開發的一款Log4j的升級產品。 Commons Logging Apache基金會所屬的項目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名為Commons Logging。 Slf4j 類似於Commons Logging,是一套簡易Java日志門面,本身並無日志的實現。(Simple Logging Facade for Java,縮寫Slf4j)。 Logback 一套日志組件的實現(slf4j陣營)。 Jul (Java Util Logging),自Java1.4以來的官方日志實現,也就是JDK自帶的實現。

 

三:Tomcat日志:

 1.JDK的實現:

    由於JDK的內部,默認提供了關於Log的配置文件,文件位於:Java\jre1.8\lib\logging.properties,

    而對比Tomcat的輸出,我們的內容並沒有輸出到文件中。Log日志信息都輸出到了Console中。

    2.tomcat的實現:

  tomcat默認使用JULI日志,也就是java自己的Log:java.util.logging.Logger。

  項目中我們可以使用log4j來打印自己的日志。tomcat打印自己的系統日志,log4j打印項目中的日志,兩者是不沖突的,可以同時工作,也就是說tomcat\logs目錄下的日志是由他們兩個共同打印出來的

 3.tomcat默認使用JULI日志,如何驗證呢:

  tomcat會加載\conf\logging.properties配置文件,在該配置文件中配置了java.util.logging.ConsoleHandler,使用的是java日志logging包下的類 

Tomcat中增加自定義的logger配置文件,這一過程是通過啟動腳本catalina.bat(目錄:apache-tomcat-8.0.38\bin\catalina.bat)來實現的,所以我們可以編輯catalina.bat文件,有兩個參數:LOGGING_CONFIG、LOGGING_MANAGER     --設置配置   if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig   set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" 
  //此時我們可以打開tomcat的安裝目錄,進入到conf\logging.properties文件中進行查看,就可以看到.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler,也就驗證了tomcat默認使用java的Log來打印日志

  if not "%LOGGING_MANAGER%" == "" goto noJuliManager   set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager   即啟動參數中包含兩個-D參數 java.util.logging.config.file,java.util.logging.manager。

 

 4.Tomcat下默認的的配置文件:conf\logging.properties中,同時指定了多個handlers,分別對應的是tomcat\logs目錄

 5.Tomcat 日志信息分為兩類 :

一是運行中的日志,它主要記錄運行的一些信息,尤其是一些異常錯誤日志信息 。
二是訪問日志信息,它記錄的訪問的時間,IP ,訪問的資料等相關信息。

默認 tomcat 不記錄訪問日志,如下方法可以使 tomcat 記錄訪問日志: 編輯 catalina/conf/server.xml文件: 注釋掉<Valve className="org.apache.catalina.valves.AccessLogValve">之后,就看不到所有的請求參數了。 //server.xml的每一個元素都對應了Tomcat中的一個組件
AccessLogValve的作用是通過日志記錄其所在的容器中處理的所有請求,記錄的日志就是訪問日志,每天的請求會寫到一個日志文件里

 

四:總結一下:

1.Tomcat內部的日志實現,是使用JULI,
Tomcat使用的日志配置文件:$CATALINA_BASE/conf/logging.properties
Tomcat日志管理類默認使用的是JULI:LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"

2.Tomcat下相關的日志文件
Cataline引擎的日志文件,文件名catalina.日期.log
注:{catalina} 是 tomcat 的安裝目錄

3.Tomcat下Web應用程序可以使用如下3種日志:
使用JDK提供的日志java.util.logging.
使用Java Servlets規范中定義的日志javax.servlet.ServletContext.log(...)
使用其他日志框架,如log4j


4.也可以使用界面來管理tomcat的項目,此時需要在tomcat-user.xml中進行配置,然后訪問:http://localhost:8081/manager/html

 

五:Log4j的日志實現

  Log4j可以打印我們項目中自己的日志信息,它有主要的組件:Loggers(記錄器),Appenders (輸出源)和Layouts(布局),這里不做介紹。

  實現原理:會自動幫我們加載日志文件,只要我們放到對應的目錄下就可以,約定大於配置。

  直接看源碼:LogManager類:org.apache.log4j.LogManager

    // By default we use a DefaultRepositorySelector which always returns 'h'.
    Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG)); repositorySelector = new DefaultRepositorySelector(h); 
  //step1:先去找有沒有覆蓋的
/** Search for the properties file log4j.properties in the CLASSPATH. */ String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY, null); // if there is no default init override, then get the resource // specified by the user or the default config file. if(override == null || "false".equalsIgnoreCase(override)) {   //step2:再找有我們有沒有自己配置 String configurationOptionStr = OptionConverter.getSystemProperty( DEFAULT_CONFIGURATION_KEY, null); String configuratorClassName = OptionConverter.getSystemProperty( CONFIGURATOR_CLASS_KEY, null); URL url = null; // if the user has not specified the log4j.configuration // property, we search first for the file "log4j.xml" and then // "log4j.properties" if(configurationOptionStr == null) {
  //step3:在系統的類路徑下,嘗試加載log4j.xml url
= Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE); if(url == null) {
//step4:嘗試去加載log4j.properties url
= Loader.getResource(DEFAULT_CONFIGURATION_FILE); } } else { try { url = new URL(configurationOptionStr); } catch (MalformedURLException ex) { // so, resource is not a URL: // attempt to get the resource from the class path url = Loader.getResource(configurationOptionStr); } } // If we have a non-null url, then delegate the rest of the // configuration to the OptionConverter.selectAndConfigure // method. if(url != null) { LogLog.debug("Using URL ["+url+"] for automatic log4j configuration."); try { OptionConverter.selectAndConfigure(url, configuratorClassName, LogManager.getLoggerRepository()); } catch (NoClassDefFoundError e) { LogLog.warn("Error during default initialization", e); } } else { LogLog.debug("Could not find resource: ["+configurationOptionStr+"]."); } } else { LogLog.debug("Default initialization of overridden by " + DEFAULT_INIT_OVERRIDE_KEY + "property."); }

 

也就是說:

  1. 獲取系統屬性,看是否用戶設置了override。默認是不設置的。

  2.查看我們自己是否有配置

  3. 如果確實沒有設置,那么嘗試找一下,有沒有log4j.xml,有則加載。

  4. 如果還沒有,那么嘗試找一下,有沒有log4j.properites,有則加載。

所以,你把log4j.xml或log4j.properties放在這些目錄下,那么log4j會“自動去加載”到,不用程序里手工寫加載代碼了。這也就“約定大於配置的好處”。

參考:

 https://www.zhihu.com/question/40854079

https://www.cnblogs.com/alipayhutu/archive/2013/04/18/3028249.html

 

六:其他

日志Log類:

 

 

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

 

配置文件: 以log4j.properties文件為例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM