更好的調試,分析問題。html
普通的一個請求處理10秒鐘,日誌10秒鐘,總共就得20秒鐘,這確定是不行的,由於日誌嚴重影響了性能。因此,咱們就有必要了解日誌的實現方式,以及它是如何下降IO的時間。java
java的有本身的日誌輸出,tomcat也有本身的日誌輸出,下面就讓咱們簡單瞭解下,以便整理思路。apache
1.可使用JDK自帶的Log類,也可使用其餘的日誌框架,如log4j,Slf4j等日誌框架tomcat
常見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自帶的實現。
1.JDK的實現:框架
因爲JDK的內部,默認提供了關於Log的配置文件,文件位於:Java\jre1.8\lib\logging.properties,ide
而對比Tomcat的輸出,咱們的內容並無輸出到文件中。Log日誌信息都輸出到了Console中。工具
2.tomcat的實現:佈局
tomcat默認使用JULI日誌,也就是java本身的Log:java.util.logging.Logger。性能
項目中咱們可使用log4j來打印本身的日誌。tomcat打印本身的系統日誌,log4j打印項目中的日誌,二者是不衝突的,能夠同時工做,也就是說tomcat\logs目錄下的日誌是由他們兩個共同打印出來的url
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能夠打印咱們項目中本身的日誌信息,它有主要的組件: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文件爲例