1. 程式人生 > 其它 >日誌框架學習-log4j

日誌框架學習-log4j

1. 日誌框架

JUL(java util logging)、logback、log4j、log4j2
JCL(Jakarta Commons Logging)、slf4j( Simple Logging Facade for Java)

  • 日誌門面
    JCL、slf4j
  • 日誌實現
    JUL、logback、log4j、log4j2

2. log4j學習

2.1 基礎

  1. 依賴關係

    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>1.2.17</version>
    </dependency>
    
  2. 日誌級別

    • 每個Logger都被了一個日誌級別(log level),用來控制日誌資訊的輸出。
    • 日誌級別從高到低分為:
      • fatal 指出每個嚴重的錯誤事件將會導致應用程式的退出。
      • error 指出雖然發生錯誤事件,但仍然不影響系統的繼續執行。
      • warn 表明會出現潛在的錯誤情形。
      • info 一般和在粗粒度級別上,強調應用程式的執行全程。
      • debug 一般用於細粒度級別上,對除錯應用程式非常有幫助。
      • trace 是程式追蹤,可以用於輸出程式執行中的變數,顯示執行的流程。
    • 還有兩個特殊的級別:
      • OFF,可用來關閉日誌記錄。
      • ALL,啟用所有訊息的日誌記錄。

    注:一般只使用4個級別,優先順序從高到低為 ERROR > WARN > INFO > DEBUG

2.2 log4j元件

log4j:主要由Loggers(日誌記錄器)、Appenders(輸出端)和 Layout(日誌格式化器)組成。其中Loggers 控制日誌的輸出級別與日誌是否輸出;Appenders 指定日誌的輸出方式(輸出到控制檯、檔案等);Layout 控制日誌資訊的輸出格式。

  1. Loggers

日誌記錄器,負責收集處理日誌記錄,例項的命名就是類“XX”的full quailied name(類的全限定名),Logger的名字大小寫敏感,其命名有繼承機制:例如:name為org.apache.commons的logger會繼承name為org.apache的logger。

Log4J中有一個特殊的logger叫做“root”,他是所有logger的根,也就意味著其他所有的logger都會直接或者間接地繼承自root。root logger可以用Logger.getRootLogger()方法獲取。

  1. Appenders

Appender 用來指定日誌輸出到哪個地方,可以同時指定日誌的輸出目的地。Log4j 常用的輸出目的地有以下幾種:

輸出端型別 作用
ConsoleAppender 將日誌輸出到控制檯
FileAppender 將日誌輸出到檔案中
DailyRollingFileAppender 將日誌輸出到一個檔案,並且每天輸出到一個新的檔案
RollingFileAppender 將日誌資訊輸出到一個日誌檔案,並且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時產生一個新的檔案
JDBCAppender 把日誌資訊儲存到資料庫中
  1. Layout

佈局器 Layouts用於控制日誌輸出內容的格式。Log4j常用的Layouts:

格式化器型別 作用
HTMLLayout 格式化日誌輸出為HTML表格形式
SimpleLayout 簡單的日誌輸出格式化,列印的日誌格式為(info - message)
PatternLayout 最強大的格式化期,可以根據自定義格式輸出日誌,如果沒有指定轉換格式,就是用預設的轉換格式

3.1 Layout格式

可在log4j.properties配置檔案中,定義輸出的格式:

 * log4j 採用類似 C 語言的 printf 函式的列印格式格式化日誌資訊,具體的佔位符及其含義如下:
	%m 輸出程式碼中指定的日誌資訊
	%p 輸出優先順序,及 DEBUG、INFO 等
	%n 換行符(Windows平臺的換行符為 "\n",Unix 平臺為 "\n")
	%r 輸出自應用啟動到輸出該 log 資訊耗費的毫秒數
	%c 輸出列印語句所屬的類的全名
	%t 輸出產生該日誌的執行緒全名
	%d 輸出伺服器當前時間,預設為 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日
	HH:mm:ss}
	%l 輸出日誌時間發生的位置,包括類名、執行緒、及在程式碼中的行數。如:
	Test.main(Test.java:10)
	%F 輸出日誌訊息產生時所在的檔名稱
	%L 輸出程式碼中的行號
	%% 輸出一個 "%" 字元

* 可以在 % 與字元之間加上修飾符來控制最小寬度、最大寬度和文字的對其方式。如:
	%5c 輸出category名稱,最小寬度是5,category<5,預設的情況下右對齊
	%-5c 輸出category名稱,最小寬度是5,category<5,"-"號指定左對齊,會有空格
	%.5c 輸出category名稱,最大寬度是5,category>5,就會將左邊多出的字元截掉,<5不會有空格
	%20.30c category名稱<20補空格,並且右對齊,>30字元,就從左邊交遠銷出的字元截掉

2.3 log4j配置檔案-log4j.properties

  • 基本配置
# 指定 RootLogger 頂級父元素預設配置資訊
# 指定日誌級別=debug,使用的 Appender為=mConsole
log4j.rootLogger=,mConsole

# 自定義 logger 物件設定
log4j.logger.cn.cup.edu = INFO,mConsole
log4j.logger.org.apache = error

#################################
# Console Appender
#################################
log4j.appender.mConsole=org.apache.log4j.ConsoleAppender
log4j.appender.mConsole.encoding=UTF-8
log4j.appender.mConsole.Threshold=debug
log4j.appender.mConsole.Target=System.out
log4j.appender.mConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.mConsole.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n
#################################

#################################
# File Appender
#################################
log4j.appender.mFile=org.apache.log4j.FileAppender
log4j.appender.mFile.encoding=UTF-8
log4j.appender.mFile.Threshold=debug
log4j.appender.mFile.file=/logs/log4j.log
log4j.appender.mFile.layout=org.apache.log4j.PatternLayout
log4j.appender.mFile.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n
#################################

#################################
# 按照檔案大小拆分的 FileAppender 物件
#################################
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.encoding=UTF-8
log4j.appender.rollingFile.Threshold=debug
log4j.appender.rollingFile.file=/logs/log4j.log
#指定日誌檔案內容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
#指定日誌檔案的數量
log4j.appender.rollingFile.maxBackupIndex=10
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n
#################################


#################################
# 按照時間規則拆分的 appender 物件
#################################
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定日誌檔案的字符集
log4j.appender.dailyFile.encoding=UTF-8
log4j.appender.dailyFile.Threshold=debug
# 指定訊息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定訊息格式的內容
log4j.appender.dailyFile.layout.conversionPattern =[%p][%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n
# 指定日誌檔案儲存路徑
log4j.appender.dailyFile.file = /logs/log4j.log
# 指定日期拆分規則
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss
#################################

#################################
#mysql
#################################
log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout=org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver=com.mysql.jdbc.Driver
log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test
log4j.appender.logDB.User=root
log4j.appender.logDB.Password=root
log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_category,message) \
  values('log4jTest','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')