1. 程式人生 > >JAVA中使用LOG4J記錄日誌

JAVA中使用LOG4J記錄日誌

在專案開發中,記錄錯誤日誌是一個很有必要功能。一是方便除錯;二是便於發現系統執行過程中的錯誤;三是儲存業務資料,便於後期分析;

在java中,記錄日誌,有很多種方式。

比如,自己實現。

自己寫類,將日誌資料,以io操作方式,寫資料到文字檔案。或者是寫到資料庫中。

比如,使用log4j。

log4j,這也是此文要記錄的。log4j,以前在用.Net做web form時,用log4net。平臺通吃。而且,log4j可以將日誌,輸出到console視窗,輸出到文字檔案,輸出到資料庫等,功能還是很強大的!

比如,使用jdk自帶的logging.jar中的方法。

比如,使用slfj。

slfj,是也是一個很強大的功能。slfj旨在一統天下,也就是slfj提供了logging.jar 和 log4j的介面,可以通過slfj來呼叫log4j,也可以呼叫jdk的logging。

從需求出發,記錄log4j

1、log4j引入哪些包?

去官網看看吧

2、新增配置檔案

在src下,也就是class下,把log4j的配置檔案新增進去log4j.properties,標準的properties檔案(Properties檔案的操作,參考此文)

3、建一個類檔案,建主函式,下圖為結構

在這裡插入圖片描述

4、修改配置檔案,使用log4j將日誌輸出到console視窗

我們經常使用System.out.println(“日誌內容”),來將內容輸出。今天不用這個了。用log4j的。
log4J配置檔案為:

設定級別和目的地(這裡多個目的地)

log4j.rootLogger = DEBUG,CONSOLE

這裡的me是包,也就是在這個包記錄日誌時,是隻記錄debug及以上級別的日誌

log4j.logger.me=DEBUG

輸出到控制檯

log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %m%n

main主函式呼叫:

import org.apache.log4j.Logger;
 
public class Log4jTest {
    public static Logger logger1 = Logger.getLogger(Log4jTest.class);
    public static void main(String[] args) {
        //logger1
        logger1.trace("我是logger1,trace");
        logger1.debug("我是logger1,debug");
        logger1.info("我是logger1,info");
        logger1.warn("我是logger1,warn");
        logger1.error("我是logger1,error");
        logger1.fatal("我是logger1,fatal");
    }
}

可以看到console中輸出內容:

16:51:16,575 DEBUG Log4jTest:15 [main:0]- 我是logger1,debug
16:51:16,578 INFO Log4jTest:16 [main:3]- 我是logger1,info
16:51:16,578 WARN Log4jTest:17 [main:3]- 我是logger1,warn
16:51:16,578 ERROR Log4jTest:18 [main:3]- 我是logger1,error
16:51:16,578 FATAL Log4jTest:19 [main:3]- 我是logger1,fatal

5、log4j將日誌輸出到console視窗,說說輸出的格式

在標題4中,看到console的輸出內容,是按一定格式輸出。格式的配置還是來自於配置檔案log4j.properties

log4j.appender.CONSOLE.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L - %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”輸出日誌資訊換行
可以在%與模式字元之間加上修飾符來控制其最小寬度、最大寬度、和文字的對齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,預設的情況下右對齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,”-”號指定左對齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字元截掉,但小於30的話也不會有空格。
4)%20.30c:如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字元,就從左邊交遠銷出的字元截掉。

6、log4j將日誌輸出到文字檔案

log4j配置檔案:

### 設定級別和目的地(這裡多個目的地) ###
log4j.rootLogger = trace,CONSOLE,zhangsanLog
log4j.logger.me=DEBUG
 
### 輸出到控制檯 ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{1}:%L [%t:%r]- %m%n
 
### 輸出到日誌檔案 ###
log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 只輸出DEBUG級別以上的日誌
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天產生一個新的檔案
log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false

main函式呼叫:

public static Logger logger1 = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
    //logger1
    logger1.trace("我是logger1,trace");
    logger1.debug("我是logger1,debug");
    logger1.info("我是logger1,info");
    logger1.warn("我是logger1,warn");
    logger1.error("我是logger1,error");
    logger1.fatal("我是logger1,fatal");
}

暫時不做說明,具體配置說明,見後續文章

7、log4j將日誌輸出到文字檔案,並且,每一小時生成一個檔案,每天一個檔案,每半天一個檔案

繼續使用標題6的配置,但是需要修改幾個地方。

在6中,有這句話

log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender

這句話的意思是,寫到檔案中,並且追加,那麼多久生成一個檔案呢?

需要修改

log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd

DatePattern=’.’yyyy-ww:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每週
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天兩次
5)’.’yyyy-MM-dd-HH: 每小時
6)’.’yyyy-MM-dd-HH-mm: 每分鐘

8、log4j將日誌輸出到文字檔案,並且,每當文字檔案為3KB大時,新建一個檔案。

同樣使用6的程式碼:

log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 輸出DEBUG級別以上的日誌
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天產生一個新的檔案
log4j.appender.zhangsanLog.MaxFileSize = 2KB
log4j.appender.zhangsanLog.MaxBackupIndex = 5
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false

這裡修改的是

log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender

MaxFileSize,當檔案達到多大儲存空間時,就新建一個檔案

MaxBackupIndex,最多會新建幾個檔案(如果設定的小了,當檔案個數較多時,後續就不再新建檔案了)

9、log4j將日誌輸出到資料庫

暫無

10、log4j將日誌輸出到hadoop框架中的hbase上

暫無

Log4j的日誌級別

(由低到高。可以聯想到windows或unix的錯誤級別,都是類似的):

    trace: 是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出。

    debug: 除錯麼,我一般就只用這個作為最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就好了麼。

    info: 輸出一下你感興趣的或者重要的資訊,這個用的最多了。

    warn: 有些資訊不是錯誤資訊,但是也要給程式設計師的一些提示,類似於eclipse中程式碼的驗證不是有error 和warn(不算錯誤但是也請注意,比如以下depressed的方法)。

    error: 錯誤資訊。用的也比較多。

    fatal: 級別比較高了。重大錯誤,這種級別你可以直接停止程式了,是不應該出現的錯誤麼!不用那麼緊張,其實就是一個程度的問題。

log4j的配置,說明:

Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種是properties格式的檔案。一般我常用的是properties檔案
1、log4j.rootLogger = [ level ] , appenderName, appenderName, …

level:是log4j的日誌級別,優先順序從高到低分別是ERROR、WARN、INFO、DEBUG。

appenderName:就是指定日誌資訊輸出到哪個地方。可同時指定多個輸出目的地。

2、配置日誌資訊輸出目的地Appender,其語法為:

log4j.appender.appenderName = fully.qualified.name.of.appender.class

log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制檯),
org.apache.log4j.FileAppender(檔案),
org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案),
org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),
org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)

3、設定好appender後,針對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:每週滾動一次檔案,即每週產生一個新的檔案。當然也可以指定按月、周、天、時和分。即對應的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每週
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天兩次
5)’.’yyyy-MM-dd-HH: 每小時
6)’.’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:指定可以產生的滾動檔案的最大數。

  1. 配置日誌資訊的佈局,其語法為:

    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    log4j.appender.appenderName.layout.option1 = value1

    log4j.appender.appenderName.layout.option = valueN
    其中,Log4j提供的layout有以下幾種:
    org.apache.log4j.HTMLLayout(以HTML表格形式佈局),
    org.apache.log4j.PatternLayout(可以靈活地指定佈局模式),
    org.apache.log4j.SimpleLayout(包含日誌資訊的級別和資訊字串),
    org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等等資訊)

關於additivity

log4j.additivity.zhangsanLog = false

這個additivity也是很有意思的選項。

它是 子Logger 是否繼承 父Logger 的 輸出源(appender) 的標誌位。具體說,預設情況下子Logger會繼承父Logger的appender,也就是說子Logger會在父Logger的appender裡輸出。若是additivity設為false,則子Logger只會在自己的appender裡輸出,而不會在父Logger的appender裡輸出。
效果如下:

log4j.rootLogger=WARN,A2,A3
log4j.logger.test=DEBUG 
 
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=../logs/test.log
log4j.appender.A2.Encoding=UTF-8
log4j.appender.A2.Append=true
log4j.appender.A2.MaxFileSize=2MB
log4j.appender.A2.MaxBackupIndex=5
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n 
 
log4j.additivity.test.xml=false
log4j.logger.test.xml=DEBUG,A3 
 
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.File=../logs/test-xml.log
log4j.appender.A3.Encoding=UTF-8
log4j.appender.A3.Append=true
log4j.appender.A3.MaxFileSize=2MB
log4j.appender.A3.MaxBackupIndex=5
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n

配置檔案中有

log4j.logger.test=DEBUG

log4j.additivity.test.xml=false

log4j.logger.test.xml=DEBUG,A3

這個例項中,通過log4j.additivity.test.xml=false這一句取消了繼承關係,這樣XML的log就只會在A3中輸出;而不會在再

還有一個需求,

不考慮日誌級別,a.java, b.java, c.java 分別呼叫自己的logger,將日誌分別寫入到不同的檔案中。

這個需求主要是在配置檔案中,給appender取個名字

然後在呼叫時,使用名稱的方式呼叫,就可以了。

public static Logger loggerA = Logger.getLogger(“Alog”);

public static Logger loggerB = Logger.getLogger(“Blog”);

public static Logger loggerC = Logger.getLogger(“Clog”);