tomcat在運行時,會在logs文件夾下生成以.log結尾的文件,該文件就是日誌,經過這些日誌信息能夠快速的定位程序的問題。在一個完整的軟件系統中,記錄日誌是必不可少的一個模塊,由於要記錄的日誌可能會較多,所以該工做是System.out.println()沒法完成的。
日誌信息根據用途與記錄內容的不一樣,分爲調試日誌、運行日誌、異常日誌等。
在java中用於記錄日誌的技術有不少,經常使用的有:html
其中除了logger使用的機率較小,所以主要介紹後面三個。java
爲了方便日誌信息的輸出顯示,對日誌內容進行了分級管理。 日誌級別由高到低 ,共分 6 個級別:apache
爲何要對日誌進行分級呢?
將日誌輸出到控制檯,或者寫入到文件中,這些操做都會下降程序的運行效率。但因爲開發須要、便於維護等緣由,要將必要的日誌信息記錄,這時就須要在代碼中加入記錄日誌的相關語句。假設在開發調試程序時須要記錄日誌信息,等到系統上線後這些信息就不必記錄了,此時須要將記錄日誌信息相關代碼所有刪除,這個過程費時費力。
將日誌信息進行分級管理以後,即可方便的控制信息輸出內容及輸出位置,哪些信息須要輸出,哪些信息不須要輸出,只需在一個日誌控制文件中稍加修改便可,不用修改代碼中的內容。即在開發調試程序時,將日誌信息級別設置低一些,這樣輸出的日誌信息會很是多,當系統上線以後,將日誌信息級別設置的高一些,此時只有少部分日誌信息被記錄。api
log4j是apache旗下的項目,apache已經在2015年8月5日宣佈log4j 1.x的版本已經再也不更新了,最終版本是log4j 1.2.17的版本,推薦開發者使用log4j2,可是有些稍舊點的項目仍然在使用1.x的版本,因此這裏先簡單介紹下。
jar包的下載能夠到其官網中下載:http://logging.apache.org/log4j/1.2/
百度網盤下載:http://pan.baidu.com/s/1kU4WZWztomcat
爲了控制日誌的輸出,在Log4j中提供了日誌輸出控制文件,該文件主要由三個部分構成:bash
有了日誌輸出控制文件,代碼中只要設置好日誌信息內容及其級別便可,經過控制文件
即可控制這些日誌信息的輸出了。markdown
1.導入jar包
將log4j-1.2.17.zip文件解壓後便可看到log4j-1.2.17.jar文件,將該jar包拷貝到項目中。app
2.放入日誌輸出控制文件
在src目錄下建立log4j.properties文件,將下面內容拷貝到文件中保存。框架
1 log4j.rootLogger=info,console 2 3 #控制檯附加器 4 log4j.appender.console = org.apache.log4j.ConsoleAppender 5 log4j.appender.console.Target = System.out 6 log4j.appender.console.layout = org.apache.log4j.PatternLayout 7 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n 8 9 #文件附加器 10 log4j.appender.file = org.apache.log4j.FileAppender 11 log4j.appender.file.File = f:/monkey1024/monkey.log 12 log4j.appender.file.layout = org.apache.log4j.PatternLayout 13 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n 14 15 #滾動文件附加器 16 log4j.appender.rollfile = org.apache.log4j.RollingFileAppender 17 log4j.appender.rollfile.File = f:/monkey1024/monkey.log 18 log4j.appender.rollfile.MaxFileSize = 10KB 19 log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout 20 log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
3.代碼中實現日誌記錄佈局
1 package com.monkey1024.test; 2 3 import org.apache.log4j.Logger; 4 5 /** 6 * log4j 7 * 8 */ 9 public class Log4jTest01 { 10 11 public static void main(String[] args) { 12 //建立記錄日誌的對象 13 Logger log = Logger.getLogger(Log4jTest01.class); 14 15 //下面語句會根據log4j.properties中的日誌級別輸出 16 log.debug("debug信息"); 17 log.info("info信息"); 18 log.warn("warn信息"); 19 log.error("error信息"); 20 } 21 22 }
上面代碼中的日誌輸出語句,會根據 log4j.properties 文件中日誌級別的設置進行輸出,會輸出到指定位置。 其輸出結果是:輸出指定級別及其更高級別的信息。如指定 info 級別,則會輸出 fatal、 error、 warn、 info 級別的信息。就本例而言,上面代碼不會執行 debug()方法。
日誌屬性文件 log4j.properties 是專門用於控制日誌輸出的。其主要進行三方面控制:
日誌屬性文件由下面兩個對象組成:
定義日誌附加器 appender
附加器的本質是一個接口,其定義語法爲:
log4j.appender.appenderName = 輸出位置
appenderName 爲自定義名稱。
輸出位置爲log4j 指定的類型,是定義好的一些 appender 接口的實現類。打開 log4j解壓目錄下的 site文件夾下的 index.html,在打開的頁面中點擊 JavaDoc,便可可看到 log4j 的 API。
在log4j.properties中編寫以下配置:
log4j.appender.console = org.apache.log4j.ConsoleAppender
該配置的appender名字爲console,類型是org.apache.log4j.ConsoleAppender即將日誌輸出到控制檯。
經常使用的附加器實現類
經過上面附加器能夠指定日誌輸出的位置。
修飾日誌附加器
修飾日誌附加器,是爲定義好的附加器添加一些屬性,以控制到指定位置的輸出。不一樣的附加器,其修飾屬性不一樣。
控制檯附加器:
1 log4j.appender.console = org.apache.log4j.ConsoleAppender 2 log4j.appender.console.Target = System.out 3 log4j.appender.console.layout = org.apache.log4j.PatternLayout 4 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
Target:控制輸出到控制檯的使用目標。其值爲 System.out 或 Sytem.err。它們的區別是,
System.out 是以黑色字體顯示到控制檯,而 System.err 則是以紅色字體顯示。
文件附加器:
1 log4j.appender.file = org.apache.log4j.FileAppender 2 log4j.appender.file.File = f:/monkey1024/monkey.log 3 log4j.appender.file.layout = org.apache.log4j.PatternLayout 4 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
log4j.appender.file.File:日誌要輸出的文件位置及文件名稱。
滾動文件附加器:
1 log4j.appender.rollfile = org.apache.log4j.RollingFileAppender 2 log4j.appender.rollfile.File = f:/monkey1024/monkey.log 3 log4j.appender.rollfile.MaxFileSize = 10KB 4 log4j.appender.rollfile.layout = org.apache.log4j.PatternLayout 5 log4j.appender.rollfile.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
MaxFileSize:用於指定日誌文件的最大值。若文件超過指定值,將自動產生另外一個日誌文件。
經常使用layout佈局
在上面的配置文件中都出現了layout,該項能夠配置日誌的佈局類型,經常使用的以下:
配置根Logger
配置 rootLogger,以便於代碼加載來控制日誌的輸出。其語法爲:
log4j.rootLogger = [ level ] , appenderName1,appenderName2, …
其中,level 是日誌記錄的優先級,分爲 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL。建議只使用四個級別,優先級從高到低分別是 ERROR、WARN、INFO、DEBUG。OFF 爲關閉日誌功能。
低級別的能夠顯示高級別的,但高級別的不能顯示低級別的。因此,級別越高,未來顯示的信息就越少。
例如:
1 log4j.rootLogger=info,console,file 2 3 #控制檯附加器 4 log4j.appender.console = org.apache.log4j.ConsoleAppender 5 log4j.appender.console.Target = System.out 6 log4j.appender.console.layout = org.apache.log4j.PatternLayout 7 log4j.appender.console.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n 8 9 #文件附加器 10 log4j.appender.file = org.apache.log4j.FileAppender 11 log4j.appender.file.File = f:/monkey1024/monkey.log 12 log4j.appender.file.layout = org.apache.log4j.PatternLayout 13 log4j.appender.file.layout.ConversionPattern= [%-5p][%d{yyyy-MM-dd HH:mm:ss}]%m%n
apache官方已經聲明log4j1.x再也不更新,建議開發者使用log4j2,它相比1.x在使用上發生了較大的變化。
使用log4j2記錄日誌的步驟
1.下載jar包
log4j2官網下載:http://logging.apache.org/log4j/2.x/
百度網盤下載:http://pan.baidu.com/s/1minAspq
下載後須要將下面兩個jar包導入到項目中
2.添加日誌輸出控制文件
在log4j2中的配置文件是 XML 格式的文件,再也不支持properties 文件。在src目錄下建立log4j2.xml文件,裏面寫上下面內容。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <Configuration status="OFF"> 3 <Appenders> 4 <!-- console --> 5 <Console name="Console" target="SYSTEM_OUT"> 6 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 7 </Console> 8 <!-- file --> 9 <File name="file" fileName="log/output.log" append="true"> 10 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 11 </File> 12 <!-- rollingFile --> 13 <RollingFile name="roolingFlie" fileName="logs/app.log" 14 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> 15 <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 16 <SizeBasedTriggeringPolicy size="1kb" /> 17 </RollingFile> 18 </Appenders> 19 <Loggers> 20 <Root level="info"> 21 <AppenderRef ref="Console" /> 22 </Root> 23 </Loggers> 24 </Configuration>
3.編寫日誌記錄代碼
導包的時候注意Logger 與 LogManager 都是 org.apache.logging.log4j 包中的類,而不是org.apache.log4j包中的。另外在建立記錄日誌對象時,使用的是LogManager類
1 package com.monkey1024.test; 2 3 import org.apache.logging.log4j.LogManager; 4 import org.apache.logging.log4j.Logger; 5 6 /** 7 * log4j2 8 * 9 */ 10 public class Log4j2Test01 { 11 12 public static void main(String[] args) { 13 //建立記錄日誌的對象 14 Logger log = LogManager.getLogger(Log4j2Test01.class); 15 16 //下面語句會根據log4j2.xml中的日誌級別輸出 17 log.debug("debug信息"); 18 log.info("info信息"); 19 log.warn("warn信息"); 20 log.error("error信息"); 21 22 23 } 24 25 }
上面代碼會將info以上級別的日誌信息輸出到控制檯中。
若開發者沒有設置 log4j2.xml,則系統會使用默認的日誌配置:只會輸出到控制檯 error 級別的信息。
configuration標籤
configuration標籤的 status 屬性用於設置 Log4j2 自身運行的日誌顯示級別,通常爲OFF,不顯示,也能夠設置爲 ERROR、DEBUG 等其它級別。
Console標籤
Console標籤的 target 屬性用於設置輸出的目標形式,其值通常爲:SYSTEM_OUT 或 SYSTEM_ERR
File標籤
File標籤的 fileName 屬性用於設置文件的文件保存路徑及文件名。如本例的意思是,日誌文件名爲 output.log,將其存放在當前項目的根目錄下的 log 子目錄中,若是log目錄不存在會自動建立。
append 屬性用於設置是否以追加方式將日誌寫入文件中。
RollingFile標籤
fileName 指定存放目錄及第一個日誌文件名。filePattern 指定新建立的日誌文件的文件名。本例還會對文件進行壓縮。
SizeBasedTriggeringPolicy子標籤用於指定每個日誌文件最大文件大小。當達到這個指定值後,會自動再新建一個日誌文件。
loggers標籤
用於配置根Logger 對象,用來指定所使用的日誌記錄器,及顯示的級別。
其子標籤root用於指定所使用的日誌記錄器。該子標籤的屬性 level 用於指定顯示級別,主要是經過root的子標籤appender-ref來引用appenders中定義好的記錄器。
須要注意的是,只要在appenders中定義了File、 RollingFile等,且在其中指定了日誌存放的目錄,不管是否在appender-ref中引用,這些目錄都會自動建立。
在實際應用當中,不一樣的系統可能使用了不一樣的庫來記錄日誌。好比你使用log4j2開發了一款產品,而購買你產品的用戶所使用的系統是jdk的Logging時,你可能須要對千上萬的log4j2的調用進行修改,這確定是一件費時費力的事情。爲了解決該問題,slf4j誕生了。
slf4j,全稱是Simple Logging Facade for Java,中文是簡單日誌門面。它僅僅是一種規範,一個接口,不是具體的日誌解決方案,不作具體的日誌服務。 Log4j和Log4j2以及後面要學習的logback都是 slf4j 的一種具體實現。
slf4j 有本身單獨的一套 API,這套 API 與具體的日誌實現技術的 API 是不一樣的。爲了能使 slf4j 的 API 與具體日誌實現技術 API 結合到一塊兒,在 slf4j 與具體日誌技術之間,還須要一個鏈接的 jar包。這個jar包在 sfl4j 框架中存放着。
1.導入相關jar包
2.加入日誌輸出控制文件log4j.properties文件
將以前寫的配置文件拷貝過來便可
3.代碼中實現日誌記錄
經過LoggerFactory獲取建立記錄的日誌對象,導包時須要導入org.slf4j下的類
1 package com.monkey1024.test; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 public class Slf4jTest01 { 7 8 public static void main(String[] args) { 9 //建立記錄日誌的對象 10 Logger log = LoggerFactory.getLogger(Slf4jTest01.class); 11 12 log.debug("debug信息"); 13 log.info("info信息"); 14 log.warn("warn信息"); 15 log.error("error信息"); 16 } 17 }
在slf4j的1.7.25(含)版本以前,沒有提供log4j2相關的jar,不過在log4j2中提供了相關的jar包。
1.導入相關jar包
2.添加日誌輸出控制文件log4j2.xml
將以前寫過的拷貝過來
3.編寫日誌記錄代碼
經過LoggerFactory獲取建立記錄的日誌對象,導包時須要導入org.slf4j下的類
1 package com.monkey1024.test; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 /** 7 * slf4j 8 * 9 */ 10 public class Slf4jTest02 { 11 12 public static void main(String[] args) { 13 //建立記錄日誌的對象 14 Logger log = LoggerFactory.getLogger(Slf4jTest02.class); 15 16 log.debug("debug信息"); 17 log.info("info信息"); 18 log.warn("warn信息"); 19 log.error("error信息"); 20 } 21 }
logback是log4j做者的開發的又一個記錄日誌的開源技術,相比於log4j而言,logback在不少方面都有很大的提高。logback分爲三個模塊:logback-core, logback-classic和logback-access。其中 logback-core是另外兩個的基礎模塊,logback-classic是log4j的升級版本,同時也實現了SLF4j的API,所以能夠方便的使用SLF4j,還有一點要說的就是SLF4j和logback的做者是同一我的,因此說logback是原生的實現了SLF4j。logback-access集成了一些servlet容器,好比tomcat
1.下載jar包
logback官網下載:https://logback.qos.ch/download.html
百度網盤下載:http://pan.baidu.com/s/1o7RROpG
下載完畢解壓後,須要將下面三個jar包導入到項目中:
若是要是用slf4j的話須要下載slf4j的jar包,由於slf4j和logback無縫集成,因此這裏不用下載slf4j鏈接logback的jar包了。
2.添加日誌輸出控制文件
在src目錄下建立一個logback.xml文件,裏面寫上下面內容:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 3 <configuration scan="true" scanPeriod="3 seconds" DEBUG="true"> 4 5 <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> 6 7 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 8 <encoder> 9 <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n 10 </pattern> 11 </encoder> 12 </appender> 13 14 15 <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 16 <file>file.log</file> 17 <append>true</append> 18 <encoder> 19 <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n 20 </pattern> 21 </encoder> 22 </appender> 23 24 <appender name="ROLLINGFILE" 25 class="ch.qos.logback.core.rolling.RollingFileAppender"> 26 <file>mylog.txt</file> 27 <rollingPolicy 28 class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 29 <!-- rollover daily --> 30 <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern> 31 <!-- 每一個日誌文件大小不超過100MB,在日誌文件總大小不超過20GB的狀況下保存60天, --> 32 <maxFileSize>100MB</maxFileSize> 33 <maxHistory>60</maxHistory> 34 <totalSizeCap>20GB</totalSizeCap> 35 </rollingPolicy> 36 <encoder> 37 <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n 38 </pattern> 39 </encoder> 40 </appender> 41 42 <root level="INFO"> 43 <appender-ref ref="STDOUT" /> 44 </root> 45 46 </configuration>
3.編寫日誌記錄代碼
由於logback原生就實現了SLF4j的API,因此這裏使用SLF4j。
1 package com.monkey1024.test; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import ch.qos.logback.classic.LoggerContext; 7 import ch.qos.logback.core.status.OnConsoleStatusListener; 8 import ch.qos.logback.core.status.StatusManager; 9 10 public class LogbackTest01 { 11 12 public static void main(String[] args) { 13 // 建立記錄日誌的對象 14 Logger log = LoggerFactory.getLogger(Slf4jTest01.class); 15 16 log.debug("debug信息"); 17 log.info("info信息"); 18 log.warn("warn信息"); 19 log.error("error信息"); 20 } 21 }
configuration
scan=」true」表示logback會自動加載修改後的xml配置文件,默認狀況下,每隔一分鐘掃描一次,能夠經過scanPeriod=」3 seconds」設置爲每3秒掃描一次。
DEBUG=」true」該配置並非設置日誌級別爲debug,而是會打印logback內部運行的一些信息,能夠查看logback的運行狀態,默認是false。
statusListener
能夠經過設置監聽器來監聽logback內部運行的信息和狀態。
appender
能夠編寫多個appender來實現不一樣的日誌輸出方式。
其中name屬性用於指定appender的名稱,即給appender命名
class屬性用於指定日誌的輸出方式。
encoder
在logback0.9.19版本中引入了encoder來替代layout。該標籤默認使用PatternLayoutEncoder,其中pattern標籤能夠設置日誌的輸出格式。
file
該標籤在appender標籤下,用於指定輸出日誌的文件名。
append
該標籤在appender標籤下,是否以追加的方式寫出到日誌文件中。
rollingPolicy
該標籤在appender標籤下,用來指定產生新文件的方式。
經常使用的有SizeAndTimeBasedRollingPolicy(根據日期和文件大小產生新的文件)和FixedWindowRollingPolicy(根據文件大小產生新的文件)
maxFileSize
該標籤在rollingPolicy下,當文件大小超過該標籤中指定的大小時會建立新的文件,例如:5kb,5MB,5GB,默認單位是字節b,若是隻寫500的話,則表示500b
maxHistory
該標籤在rollingPolicy下,用來指定日誌保存的天數。
totalSizeCap
該標籤在rollingPolicy下,保存日誌的總大小,一般寫在maxHistory的後面。
level
該標籤在root下,用來表示日誌的打印級別
appender-ref該標籤在root下,用來添加appender。