Log4j擴展使用--輸出地Appender


OK,如今咱們來研究輸出低Appended。html

  • Appender控制日誌輸出的位置

Log4j日誌系統容許把日誌輸出到不一樣的地方,如控制檯(Console)、文件(Files)、根據天數或者文件大小產生新的文件、以流的形式發送到其它地方等等。
Log4j內置了經常使用的輸出地,通常狀況下配置一下便可使用,全部的Appender都實現了自org.apache.log4j.Appender接口。在log4j.properties中,Appended都使用log4j.appender.*配置。

正則表達式

  • 經常使用的輸出位置有以下幾個:
ConsoleAppender(控制檯)
FileAppender(文件)
RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件)
DailyRollingFileAppender(天天產生一個日誌文件)
JDBCAppender(輸出到JDBC數據庫)
SocketAppender(遠程日至服務器)     
WriterAppender(將日誌信息以流格式發送到任意指定的地方)
SMTPAppender(發送郵件)      


  • 配置時使用方式爲:
log4j.appender.appenderName=fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1=value1
…log4j.appender.appenderName.optionN=valueN
也能夠本身實現Appender接口, 這樣就爲日誌的輸出提供了至關大的便利。


這裏咱們來舉幾個例子,熟悉下經常使用的日誌輸出。


  • 1,輸出到控制檯
控制檯是最經常使用的輸出地,前面的一系列博客咱們用的例子都是在控制檯輸出。控制檯輸出實現類爲org.apache.log4j.ConsoleAppender。
下面是一份比較完整的log4j.properties配置文件:
og4j.rootLogger=DEBUG,console

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error
關於上面這份配置文件,有3點解釋:
1,咱們在實際的配置文件中,"#"註釋必須另起一行
2,控制檯輸出須要配置layput屬性,最經常使用的就是正則表達式格式。還有一些可選的屬性,通常實際中不會怎麼用到,Encoding設置編碼方式,ImmediateFlush設置是否緩存,Target設置輸出到System.out仍是System.err。
3,Threshold用來設置該Appender的級別,只對本Appender生效。全部的Appender均可經過設置Threshold來設置本Appender的啓用級別。


  • 2,輸出到文件
文件輸出FileAppender把日誌輸出到指定的文件中,文件輸出的實現類爲org.apache.log4j.FileAppender,配置時候須要用File指定文件名稱。固然,這個路徑能夠使用相對路徑,也能夠使用絕對路徑。
下面一份文件輸出的log4j.properties的配置文件:

log4j.category.org.linkinpark.commons.logtest1=ERROR,file
log4j.rootLogger=DEBUG,console

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error



#輸出到文件(這裏默認爲追加方式)   
log4j.appender.file=org.apache.log4j.FileAppender 
#輸出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
log4j.appender.file.Append=true
#樣式爲TTCCLayout   
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
關於上面的配置文件我這裏解釋一下:

1,可選參數Append配置是否在源文件內容的基礎上追加日誌。若是是false,Logger初始化會先情清掉文件內容,也就是說每次重啓程序,原來的日誌就會丟失。若是爲true,日誌文件就會愈來愈大。默認爲true。數據庫

2,咱們上面用category屬性來從新定義咱們的本身的logtest1包下面的日誌輸出,而後指定日誌輸出到/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log文件中。apache

如今咱們來檢查下控制檯輸出沒有問題,category繼承了默認的rootLogger在控制檯輸出了,並且還在咱們上面指定的路徑下的日誌文件中追加進去了日誌內容。緩存

➜  WorkSpace  cd linkin-log-test 
➜  linkin-log-test  ls
pom.xml src     target
➜  linkin-log-test  pwd
/Users/LinkinPark/WorkSpace/linkin-log-test
➜  linkin-log-test  ls  
log     pom.xml src     target
➜  linkin-log-test  cd log 
➜  log  ls
log4j.log
➜  log  more log4j.log 
[2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(30)]: error級別的日誌輸出
  [2016-02-23 09:52:48]-[main-FATAL]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(31)]: fatal級別的日誌輸出
  [2016-02-23 09:52:48]-[main-ERROR]-[org.linkinpark.commons.logtest1.Log4jTest1-logTest(38)]: 人工拋出一個異常


  • 3,輸出到按大小滾動文件
按大小滾動文件輸出RollingFileAppender把日誌輸出到指定的文件,文件達到指定的大小時,就會自動改名。按尺寸滾動文件輸出類爲org.apache.log4j.RollingFileAppender,需配置文件名稱,文件的最大尺寸。
下面是一份配置文件:

log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file
log4j.rootLogger=DEBUG,console

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error

#輸出到文件(這裏默認爲追加方式)   
log4j.appender.file=org.apache.log4j.FileAppender 
#輸出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌從新添加
log4j.appender.file.Append=true
#樣式爲TTCCLayout   
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  

#按大小滾動文件(這裏默認爲追加方式)   
log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender 
#輸出文件位置
log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
log4j.appender.rolling_file.Append=true
#文件達到最大值自動改名
log4j.appender.rolling_file.MaxFileSize=1KB
#最多備份100個文件
log4j.appender.rolling_file.MaxBackupIndex=100
log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
關於上面的配置文件解釋以下:

1,配置的滾動文件名爲rolling_log4j,該文件在/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log路徑中,咱們設置了文件最大爲1K。當rolling_log4j.log達到1K時,就會自動改名爲rolling_log4j.log.1,rolling_log4j.log.2,rolling_log4j.log.3....直到rolling_log4j.log.100。
2,Logger支持多個Appender,用逗號將多個Appender名字隔開便可。
屢次運行咱們本身寫的測試類,會發現rolling_log4j.log文件在滾動。下面我貼出具體的文件日誌輸出:

服務器

➜  linkin-log-test  cd log 
➜  log  ls -l
total 16
-rw-r--r--  1 LinkinPark  staff  1110  2 23 10:17 log4j.log
-rw-r--r--  1 LinkinPark  staff   364  2 23 10:17 rolling_log4j.log
➜  log  ls -l 
total 16
-rw-r--r--  1 LinkinPark  staff  1850  2 23 10:18 log4j.log
-rw-r--r--  1 LinkinPark  staff     0  2 23 10:18 rolling_log4j.log
-rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
➜  log  ls -l
total 24
-rw-r--r--  1 LinkinPark  staff  2220  2 23 10:18 log4j.log
-rw-r--r--  1 LinkinPark  staff   364  2 23 10:18 rolling_log4j.log
-rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
➜  log  ls -l
total 24
-rw-r--r--  1 LinkinPark  staff  2590  2 23 10:19 log4j.log
-rw-r--r--  1 LinkinPark  staff   728  2 23 10:19 rolling_log4j.log
-rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.1
➜  log  ls -l
total 24
-rw-r--r--  1 LinkinPark  staff  2960  2 23 10:19 log4j.log
-rw-r--r--  1 LinkinPark  staff     0  2 23 10:19 rolling_log4j.log
-rw-r--r--  1 LinkinPark  staff  1092  2 23 10:19 rolling_log4j.log.1
-rw-r--r--  1 LinkinPark  staff  1092  2 23 10:18 rolling_log4j.log.2


  • 4,輸出到按日誌滾動文件

按日期滾動文件輸出DailyRollingFileAppender將日誌輸出到指定的文件,當日期發生變化時,會將文件按照指定的日期格式自動更名。日期滾動文件輸出類爲org.apache.log4j.DailyRollingFileAppender。
配置文件以下:
app

log4j.category.org.linkinpark.commons.logtest1=ERROR,file,rolling_file,daily_rolling_file
log4j.rootLogger=DEBUG,console

# 如下是rootLogger的配置,子類默認繼承,可是子類重寫下面配置=rootLogger+本身配置,我暈
#輸出到控制檯   
log4j.appender.console=org.apache.log4j.ConsoleAppender  
#設置輸出樣式   
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
#日誌輸出信息格式爲
log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n 
#DEBUG以上級別輸出,Threshold,入口,臨界值
#log4j.appender.console.Threshold=DEBUG
#日誌編碼方式
#log4j.appender.console.Encoding=UTF-8
#是否當即輸出
#log4j.appender.console.ImmediateFlush=true
#使用System.error做爲輸出
#log4j.appender.console.Target=System.error

#輸出到文件(這裏默認爲追加方式)   
log4j.appender.file=org.apache.log4j.FileAppender 
#輸出文件位置
log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
#是否在原日誌基礎上追加輸出日誌。true,默認,追加。false,清掉原來日誌從新添加
log4j.appender.file.Append=true
#樣式爲TTCCLayout   
#log4j.appender.file.layout=org.apache.log4j.TTCCLayout
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n  

#按大小滾動文件(這裏默認爲追加方式)   
log4j.appender.rolling_file=org.apache.log4j.RollingFileAppender 
#輸出文件位置
log4j.appender.rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/rolling_log4j.log
log4j.appender.rolling_file.Append=true
#文件達到最大值自動改名
log4j.appender.rolling_file.MaxFileSize=1KB
#最多備份100個文件
log4j.appender.rolling_file.MaxBackupIndex=100
log4j.appender.rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

#按日期滾動文件
log4j.appender.daily_rolling_file=org.apache.log4j.DailyRollingFileAppender 
#輸出文件位置
log4j.appender.daily_rolling_file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/daily_rolling_log4j.log
#文件滾動日期格式
log4j.appender.daily_rolling_file.DatePattern=.yyyy-MM-dd
log4j.appender.daily_rolling_file.layout=org.apache.log4j.PatternLayout
log4j.appender.daily_rolling_file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
關於上面的配置文件解釋以下:

1,上面的配置中,咱們新添加DailyRollingFileAppender類型的Appender。咱們的日誌文件名稱爲daily_rolling_file,日期格式爲yyyy-MM-dd。進入到新的一天後,文件就會被自動改名,格式爲daily_rolling_file.2008-08-08。測試

天天:’.’YYYY-MM-dd(默認)編碼

2.       每星期:’.’YYYY-wwspa

3.       每個月:’.’YYYY-MM

4.       每隔半天:’.’YYYY-MM-dd-a

5.       每小時:’.’YYYY-MM-dd-HH

6.       每分鐘:’.’YYYY-MM-dd-HH-mm


2,這種配置也是可能咱們在實際編碼中最經常使用到的,項目發佈到服務器上而後天天生成一個日誌文件。


OK,上面我整理了最經常使用的幾種Appender,他們就是ConsoleAppender(控制檯),FileAppender(文件),RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),DailyRollingFileAppender(天天產生一個日誌文件)。剩下的幾種咱們通常不會用到,這裏也就不作贅述了。如今咱們來整理下這4種Appender的關係。

上面的4種Appender都實現了Appender接口,而後ConsoleAppender和FileAppender同級別,FileAppender之下衍生出了2個子類RollingFileAppender,DailyRollingFileAppender。關於這些我會在後面的源碼系列中仔細的整理到的。

相關文章
相關標籤/搜索