日誌記錄

日誌

tomcat在運行時,會在logs文件夾下生成以.log結尾的文件,該文件就是日誌,經過這些日誌信息能夠快速的定位程序的問題。在一個完整的軟件系統中,記錄日誌是必不可少的一個模塊,由於要記錄的日誌可能會較多,所以該工做是System.out.println()沒法完成的。
日誌信息根據用途與記錄內容的不一樣,分爲調試日誌、運行日誌、異常日誌等。
在java中用於記錄日誌的技術有不少,經常使用的有:html

  • logger
  • log4j
  • log4j2
  • logback

其中除了logger使用的機率較小,所以主要介紹後面三個。java

日誌級別

爲了方便日誌信息的輸出顯示,對日誌內容進行了分級管理。 日誌級別由高到低 ,共分 6 個級別:apache

  • fatal(致命的)
  • error
  • warn
  • info
  • debug
  • trace(堆棧)

爲何要對日誌進行分級呢?
將日誌輸出到控制檯,或者寫入到文件中,這些操做都會下降程序的運行效率。但因爲開發須要、便於維護等緣由,要將必要的日誌信息記錄,這時就須要在代碼中加入記錄日誌的相關語句。假設在開發調試程序時須要記錄日誌信息,等到系統上線後這些信息就不必記錄了,此時須要將記錄日誌信息相關代碼所有刪除,這個過程費時費力。
將日誌信息進行分級管理以後,即可方便的控制信息輸出內容及輸出位置,哪些信息須要輸出,哪些信息不須要輸出,只需在一個日誌控制文件中稍加修改便可,不用修改代碼中的內容。即在開發調試程序時,將日誌信息級別設置低一些,這樣輸出的日誌信息會很是多,當系統上線以後,將日誌信息級別設置的高一些,此時只有少部分日誌信息被記錄。
api

log4j簡介

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

使用log4j記錄日誌

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文件分析

日誌屬性文件 log4j.properties 是專門用於控制日誌輸出的。其主要進行三方面控制:

  • 輸出位置:控制日誌將要輸出的位置,是控制檯仍是文件等。
  • 輸出佈局:控制日誌信息的顯示形式
  • 輸出級別:控制要輸出的日誌級別。

日誌屬性文件由下面兩個對象組成:

  • 根日誌,即爲 Java 代碼中的日誌記錄器,能夠控制日誌輸出級別與添加附加器。
  • 附加器,能夠設置輸出佈局、文件位置、文件大小等內容。

定義日誌附加器 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即將日誌輸出到控制檯。

經常使用的附加器實現類

  • org.apache.log4j.ConsoleAppender:日誌輸出到控制檯
  • org.apache.log4j.FileAppender:日誌輸出到文件
  • org.apache.log4j.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日誌文件
  • org.apache.log4j.DailyRollingFileAppender:天天產生一個日誌文件

經過上面附加器能夠指定日誌輸出的位置。

修飾日誌附加器
修飾日誌附加器,是爲定義好的附加器添加一些屬性,以控制到指定位置的輸出。不一樣的附加器,其修飾屬性不一樣。

控制檯附加器:

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,該項能夠配置日誌的佈局類型,經常使用的以下:

  • org.apache.log4j.HTMLLayout:網頁佈局,以 HTML 表格形式佈局
  • org.apache.log4j.SimpleLayout:簡單佈局,包含日誌信息的級別和信息字符串
  • org.apache.log4j.PatternLayout:匹配器佈局,能夠靈活地指定佈局模式。其主要是經過設置 PatternLayout 的 ConversionPattern 屬性值來控制具體輸出格式的。ConversionPattern 的值中有不少控制字符,這些字符的意義能夠百度:ConversionPattern取值說明。

配置根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

 

log4j2

apache官方已經聲明log4j1.x再也不更新,建議開發者使用log4j2,它相比1.x在使用上發生了較大的變化。
使用log4j2記錄日誌的步驟
1.下載jar包
log4j2官網下載:http://logging.apache.org/log4j/2.x/
百度網盤下載:http://pan.baidu.com/s/1minAspq
下載後須要將下面兩個jar包導入到項目中

  • log4j-api-2.9.1.jar
  • log4j-core-2.9.1.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中引用,這些目錄都會自動建立。

 

slf4j簡介

在實際應用當中,不一樣的系統可能使用了不一樣的庫來記錄日誌。好比你使用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 框架中存放着。

slf4j

將log4j改爲slf4j

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 }

 

將log4j2改爲slf4j

在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簡介

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包導入到項目中:

  • logback-access-1.2.3.jar
  • logback-classic-1.2.3.jar
  • logback-core-1.2.3.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屬性用於指定日誌的輸出方式。

  • ch.qos.logback.core.ConsoleAppender:將日誌信息輸出到控制檯
  • ch.qos.logback.core.FileAppender:日誌輸出到文件
  • ch.qos.logback.core.rolling.RollingFileAppender:當日志文件大小到達指定尺寸的時候將產生一個新的日誌文件。

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。

相關文章
相關標籤/搜索