Java實現日誌的記錄(log4j)
為什麼要寫日誌?
1.在程式開發過程中,方便除錯,並且方便發現程式執行時的錯誤資訊。
2.在生產環境時,方便排除問題。
3.可以業務資料,以便後期對資料分析
實現方式
使用log4j,通過配置,將日誌輸出到控制檯,檔案,資料庫。(因為該文章只是說明對log4j的使用,所有不涉及其它日誌類庫)
該專案使用的是maven專案,所以直接通過pom引入依賴包
<!-- 日誌 --> <!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
新增一個類,做為列印日誌的測試
package com.kevin.log; import org.apache.log4j.Logger; /** * @author kevin * @version 1.0 * @description 將日誌的各種級別輸出到控制檯與檔案 * @createDate 2018/12/29 */ public class Log4jDemo { public static Logger logger = Logger.getLogger(Log4jDemo.class); public static void main(String[] args) { for (int i = 0; i < 10000; i++) { // 日誌的級別從低到高 // 很低的日誌級別一般不會使用 logger.trace("logger的trace級別"); // 細粒度資訊對除錯應用非常有幫助,主要列印一些執行資訊 logger.debug("logger的debug級別"); // 粗粒度突出強調應用程式的執行過程,列印感興趣或者重要的資訊 logger.info("logger的info級別"); // 表明會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但也要給程式設計師一點提示 logger.warn("logger的warn級別"); // 指出雖然發生錯誤,但不影響執行,列印錯誤和異常資訊,如果不想輸出太多日誌可以使用該級別 logger.error("logger的error級別"); // 每個嚴重的錯誤事件將會導致應用程式的退出,出現錯誤可以停止程式執行進行除錯 logger.fatal("logger的fatal級別"); } } }
新增log4j.properties日誌配置檔案
1.將日誌輸出到控制檯
#設定級別和目的地(這裡可以設定多個目的地) log4j.rootLogger=DEBUG,Console #Console 輸出到控制檯 log4j.appender.Console=org.apache.log4j.ConsoleAppender #靈活設定日誌格式 log4j.appender.Console.layout=org.apache.log4j.PatternLayout #日誌輸出格式 log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
控制檯輸出的內容
2.將日誌檔案追加到檔案和控制檯(這個的缺點,是一直追加到同一個檔案中,最後檔案會無比的大)
#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,File
#Console 輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#輸出到檔案(一直輸出到該檔案中)
log4j.appender.File = org.apache.log4j.FileAppender
#輸出日誌檔案路徑
log4j.appender.File.File = E:\\log\\JavaBean_log\\File.log
#包含日誌產生的時間、執行緒、類別等等資訊
log4j.appender.File.layout = org.apache.log4j.TTCCLayout
#日誌檔案輸出格式
log4j.appender.File.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
檔案中的內容
3.輸出日誌到控制檯和檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)的日誌配置
#3.輸出日誌到控制檯和檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)的日誌配置
#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,KEVIN
#Console 輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#輸出到檔案(根據設定的檔案大小限定,達到限定大小則備份,指定備份數量,超出則覆蓋)
log4j.appender.KEVIN = org.apache.log4j.RollingFileAppender
#輸出檔案路徑
log4j.appender.KEVIN.File =E:\\log\\JavaBean_log\\RollingFile.log
#日誌檔案限定大小
log4j.appender.KEVIN.MaxFileSize=1MB
#日誌檔案備份數量上限
log4j.appender.KEVIN.MaxBackupIndex=10
#以HTML表格形式佈局
log4j.appender.KEVIN.layout = org.apache.log4j.PatternLayout
#日誌檔案輸出格式
log4j.appender.KEVIN.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
檔案中的內容
4.輸出日誌到控制檯和檔案(每天生成一個日誌檔案)的日誌配置
#設定級別和目的地(這裡可以設定多個目的地)
log4j.rootLogger=DEBUG,Console,DailyRollingFile
#Console 輸出到控制檯
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#靈活設定日誌格式
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#日誌輸出格式
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#輸出到檔案(根據設定的日期格式,每天生成一個檔案)
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender
#輸出日誌檔案路徑
log4j.appender.DailyRollingFile.File = E:\\log\\JavaBean_log\\DailyRollingFile.log
#日誌檔案生成周期,當前為每天生成一個檔案
log4j.appender.DailyRollingFile.DatePattern = '.'yyyy-MM-dd_HH_mm
#靈活指定日誌格式
log4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayout
#日誌檔案輸出格式
log4j.appender.DailyRollingFile.layout.ConversionPattern =%d [%t] %-5p [%c] - %m%n
日誌檔案內容
日誌中輸出格式,各種引數配置
%p: 輸出日誌資訊優先順序,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c: 輸出日誌資訊所屬的類目,通常就是所在類的全名
%t: 輸出產生該日誌事件的執行緒名
%l: 輸出日誌事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10)
%x: 輸出和當前執行緒相關聯的NDC(巢狀診斷環境),尤其用到像java servlets這樣的多客戶多執行緒的應用中。
%%: 輸出一個”%”字元
%F: 輸出日誌訊息產生時所在的檔名稱
%L: 輸出程式碼中的行號
%m: 輸出程式碼中指定的訊息,產生的日誌具體資訊
%n: 輸出一個回車換行符,Windows平臺為”\r\n”,Unix平臺為”\n”輸出日誌資訊換行
可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如:
%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,預設的情況下右對齊。
%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,”-”號指定左對齊。
%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。
%20.30c:如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字元,就從左邊交遠銷出的字元截掉。
根據日期週期生成日誌檔案的引數
- ’.’yyyy-MM: 每月
- ’.’yyyy-ww: 每週
- ’.’yyyy-MM-dd: 每天
- ’.’yyyy-MM-dd-a: 每天兩次
- ’.’yyyy-MM-dd-HH: 每小時
- ’.’yyyy-MM-dd-HH-mm: 每分鐘
日誌級別
// 日誌的級別從低到高
trace:很低的日誌級別一般不會使用
debug:細粒度資訊對除錯應用非常有幫助,主要列印一些執行資訊
info:粗粒度突出強調應用程式的執行過程,列印感興趣或者重要的資訊
warn:表明會出現潛在錯誤的情形,有些資訊不是錯誤資訊,但也要給程式設計師一點提示
error:指出雖然發生錯誤,但不影響執行,列印錯誤和異常資訊,如果不想輸出太多日誌可以使用該級別
fatal:每個嚴重的錯誤事件將會導致應用程式的退出,出現錯誤可以停止程式執行進行除錯
log4j的配置檔案
1. Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種的proerties格式的檔案,根據自己的愛好使用檔案格式
2. log4j.rootLogger=[level],appenderName,appenderName....
level:是日誌級別,優先順序從高到低是fatal,error,warn,info,debug,trace
appenderName:指定日誌輸出的目的地,可以指定多個目的地。
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),
org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)
3.appender的配置引數
(1).ConsoleAppender選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
Target=System.err:預設情況下是:System.out,指定輸出控制檯
(2).FileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
(3).DailyRollingFileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
DatePattern=’.’yyyy-ww:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下:
- ’.’yyyy-MM: 每月
- ’.’yyyy-ww: 每週
- ’.’yyyy-MM-dd: 每天
- ’.’yyyy-MM-dd-a: 每天兩次
- ’.’yyyy-MM-dd-HH: 每小時
- ’.’yyyy-MM-dd-HH-mm: 每分鐘
(4).RollingFileAppender 選項
Threshold=WARN:指定日誌訊息的輸出最低層次。
ImmediateFlush=true:預設值是true,意謂著所有的訊息都會被立即輸出。
File=mylog.txt:指定訊息輸出到mylog.txt檔案。
Append=false:預設值是true,即將訊息增加到指定檔案中,false指將訊息覆蓋指定的檔案內容。
MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日誌檔案到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1檔案
MaxBackupIndex=2:指定可以產生的滾動檔案的最大數。
Log4j提供的layout:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)
關於Additity:
它是 子Logger 是否繼承 父Logger 的 輸出源(appender) 的標誌位。具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸出。若是additivity設為false,則子Logger只會在自己的appender裡輸出,而不會在父Logger的appender裡輸出。