天天看點

LOG4J 學習1.添加依賴2.日志的級别3.Log4j元件4.Layout的格式5.Appender的輸出6. 自定義Logger7.開啟内置日志記錄8.執行個體配置

Log4j是Apache下的一款開源的日志架構,通過在項目中使用 Log4J,我們可以控制日志資訊輸出到控制台、檔案、甚至是資料庫中。我們可以控制每一條日志的輸出格式,通過定義日志的輸出級别,可以更靈活的控制日志的輸出過程。友善項目的調試。 官方網址

歡迎大家通路我的個人部落格可點選通路

1.添加依賴

<dependencies>
	<dependency>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
		<version>1.2.17</version>
	</dependency>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
	</dependency>
</dependencies>

           

2.日志的級别

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

注:一般隻使用4個級别,優先級從高到低為 ERROR > WARN > INFO > DEBUG

3.Log4j元件

Log4J主要由 Loggers (日志記錄器)、Appenders(輸出端)和 Layout(日志格式化器)組成。

其中Loggers 控制日志的輸出級别與日志是否輸出;Appenders 指定日志的輸出方式(輸出到控制台、檔案等);Layout 控制日志資訊的輸出格式。

3.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()方法擷取。但是,自log4j 1.2版以來, Logger 類已經取代了 Category 類。對于熟悉早期版本的log4j的人來說,Logger 類可以被視為 Category 類的别名。

3.2 Appenders

Appender 用來指定日志輸出到哪個地方,可以同時指定日志的輸出目的地。Log4j 常用的輸出目的地

有以下幾種:

輸出端類型 作用
ConsoleAppender 将日志輸出到控制台
FileAppender 将日志輸出到檔案中
DailyRollingFileAppender 将日志輸出到一個日志檔案,并且每天輸出到一個新的檔案
RollingFileAppender 将日志資訊輸出到一個日志檔案,并且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時産生一個新的檔案
JDBCAppender 把日志資訊儲存到資料庫中

3.3 Layouts

布局器 Layouts用于控制日志輸出内容的格式,讓我們可以使用各種需要的格式輸出日志。Log4j常用的Layouts:

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

同樣支援xml格式輸出 包為org.apache.log4j.xml.XMLLayout

4.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字元,就從左邊交遠銷出的字元截掉
           

5.Appender的輸出

控制台,檔案,資料庫

#指定日志的輸出級别與輸出端 第一個參數日志級别,第二個參數為輸出對象可以指定多個
log4j.rootLogger=INFO,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.A = org.apache.log4j.DailyRollingFileAppender
#指定日志的輸出路徑
log4j.appender.A.File = D:/log.txt
log4j.appender.A.Append = true
#使用自定義日志格式化器
log4j.appender.A.layout = org.apache.log4j.PatternLayout
#指定日志的輸出格式
log4j.appender.A.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] -
[%p] %m%n
#指定日志的檔案編碼
log4j.appender.A.encoding=UTF-8
#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_categ
ory,message) values('itcast','%d{yyyy-MM-dd
HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
           

6. 自定義Logger

# RootLogger配置
log4j.rootLogger = trace,console
# 自定義Logger
log4j.logger.com.itheima = info,file
log4j.logger.org.apache = error
           
@Test
public void testCustomLogger() throws Exception {
// 自定義 com.itheima
	Logger logger1 = Logger.getLogger(Log4jTest.class);
	logger1.fatal("fatal"); // 嚴重錯誤,一般會造成系統崩潰和終止運作
	logger1.error("error"); // 錯誤資訊,但不會影響系統運作
	logger1.warn("warn"); // 警告資訊,可能會發生問題
	logger1.info("info"); // 程式運作資訊,資料庫的連接配接、網絡、IO操作等
	logger1.debug("debug"); // 調試資訊,一般在開發階段使用,記錄程式的變量、參數等
	logger1.trace("trace"); // 追蹤資訊,記錄程式的所有流程資訊
// 自定義 org.apache
	Logger logger2 = Logger.getLogger(Logger.class);
	logger2.fatal("fatal logger2"); // 嚴重錯誤,一般會造成系統崩潰和終止運作
	logger2.error("error logger2"); // 錯誤資訊,但不會影響系統運作
	logger2.warn("warn logger2"); // 警告資訊,可能會發生問題
	logger2.info("info logger2"); // 程式運作資訊,資料庫的連接配接、網絡、IO操作等
	logger2.debug("debug logger2"); // 調試資訊,一般在開發階段使用,記錄程式的變量、參
數等
	logger2.trace("trace logger2"); // 追蹤資訊,記錄程式的所有流程資訊
}
           

7.開啟内置日志記錄

// 開啟 log4j 内置日志記錄
LogLog.setInternalDebugging(true);
           

會輸出更多内部日志資訊

8.執行個體配置

# 指定 RootLogger 頂級父元素預設配置資訊
# 指定日志級别=trace,使用的 apeender 為=console
log4j.rootLogger = trace,console

# 自定義 logger 對象設定
log4j.logger.com.test= info,console
log4j.logger.org.apache = error

# 指定控制台日志輸出的 appender
log4j.appender.console = org.apache.log4j.ConsoleAppender
# 指定消息格式 layout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.console.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n


# %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   輸出代碼中的行号
# %%   輸出一個 "%" 字元

# 日志檔案輸出的 appender 對象
log4j.appender.file = org.apache.log4j.FileAppender
# 指定消息格式 layout
log4j.appender.file.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.file.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志檔案儲存路徑
log4j.appender.file.file = /logs/log4j.log
# 指定日志檔案的字元集
log4j.appender.file.encoding = UTF-8


# 按照檔案大小拆分的 appender 對象
# 日志檔案輸出的 appender 對象
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
# 指定消息格式 layout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.rollingFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志檔案儲存路徑
log4j.appender.rollingFile.file = /logs/log4j.log
# 指定日志檔案的字元集
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志檔案内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB 
# 指定日志檔案的數量
log4j.appender.rollingFile.maxBackupIndex = 10


# 按照時間規則拆分的 appender 對象
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
# 指定消息格式 layout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
# 指定消息格式的内容
log4j.appender.dailyFile.layout.conversionPattern = [%-10p]%r  %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
# 指定日志檔案儲存路徑
log4j.appender.dailyFile.file = /logs/log4j.log
# 指定日志檔案的字元集
log4j.appender.dailyFile.encoding = UTF-8
# 指定日期拆分規則
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('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')