天天看點

Log4j學習(使用流程,Log4j.properties配置檔案,配置到多個不同目标)

參考網址:

【http://blog.csdn.net/drift_away/article/details/7403658】

【http://blog.csdn.net/lxzo123/article/details/6331783】

【http://baike.baidu.com/view/25347.htm?fr=aladdin】

Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志資訊輸送的目的地是控制台、檔案、資料庫等目标,而且所有的這些實作都可以通過更改配置檔案來實作,實際應用非常便利。最近因為工作需要,對這個類庫做了比較詳細的學習,整理資料如下:

一、Log4j的使用。

1)、下載下傳需要下載下傳其官方(http://logging.apache.org/log4j/2.x/)的jar包,引入工程

2)、置本地的log4j.properties檔案。(預設讀取的是src根目錄位址,如果不在根目錄,則需要在使用前調用其設定即可)

PropertyConfigurator.configure( "D:/Code/conf/log4j.properties");

3)、在代碼中擷取日志,并調用其接口記錄日志

1 Logger logger  =  Logger.getLogger(TestLog4j.class );
2 logger.debug( " debug消息 " );
3 logger.error( " error消息 " );      

二、Log4j支援兩種配置檔案格式,一種是XML格式的檔案,一種是properties格式的檔案。下面我們介紹使用properties格式做為配置檔案的方法:二、Log4j.properties配置檔案介紹

1)、Log4j.properties參數比較多,不過搞清楚其規律則會非常好用,我們首先看一個獨立的日志配置項,然後逐一介紹其參數内容和可選項。

一個簡單的完整日志配置

#配置根Logger

log4j.rootLogger=INFO,appenderName1,appenderName2,  …

#配置日志資訊輸出目的地Appender

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

  log4j.appender.appenderName.option1  =  value1

  …

  log4j.appender.appenderName.optionN  =  valueN

#配置日志資訊的格式(布局)

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

  log4j.appender.appenderName.layout.option1  =  value1

  log4j.appender.appenderName.layout.optionN  =  valueN

其中appenderName可以當作是定義了一個變量,并配置其具體參數内容。

2)、上述檔案中的參數介紹如下。

1、 配置根Logger,其文法為: 

log4j.rootLogger = [ level ] , appenderName,

appenderName, … 

其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級别。Log4j建議隻使用四個級别,優先級從高到低分别是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級别,您可以控制到應用程式中相應級别的日志資訊的開關。比如在這裡定義了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(将日志資訊以流格式發送到任意指定的地方) 

org.apache.log4j.lf5.LF5Appender (應用于Log

Factor 5 Appender:)

org.apache.log4j.net.SMTPAppender(# 應用于發送日志給郵件: )

org.apache.log4j.jdbc.JDBCAppender(# 應用于資料庫:)

..............................................................................................................................................

(1).ConsoleAppender選項 

Threshold=WARN:指定日志消息的輸出最低層次。 

ImmediateFlush=true:預設值是true,意謂着所有的消息都會被立即輸出。 

Target=System.err:預設情況下是:System.out,指定輸出控制台 

(2).FileAppender 選項 

File=mylog.txt:指定消息輸出到mylog.txt檔案。 

Append=false:預設值是true,即将消息增加到指定檔案中,false指将消息覆寫指定的檔案内容。 

(3).DailyRollingFileAppender 選項 

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 選項 

MaxFileSize=100KB: 字尾可以是KB, MB 或者是 GB. 在日志檔案到達該大小時,将會自動滾動,即将原來的内容移到mylog.log.1檔案。 

MaxBackupIndex=2:指定可以産生的滾動檔案的最大數。 

3、配置日志資訊的布局,其文法為: 

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(包含日志産生的時間、線程、類别等等資訊) 

4、輸出格式設定 (類似C語言中的printf函數的列印格式)

在配置檔案中可以通過log4j.appender.A1.layout.ConversionPattern設定日志輸出格式。 

參數: 

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

****************************************************************************

下面給出一個日志檔案配置各種不同場景的完整demlog4j.rootLogger=DEBUG,CONSOLE,A1,im#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true

###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.net.SocketAppende
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true

# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout

log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
[email protected]
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
[email protected]
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################
#自定義Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = [email protected]
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n      

三、Log4j配置不同日志檔案目錄(不同資料庫類似)

1、我們除了對不同級别的日志設定不同輸出appender目标,在一個單個配置檔案中,也可設定多個日志檔案以供不同場景使用。

假設我們需要對三個不同場景"系統","操作","遠端通路"分别記錄日志。那麼可以使用如下配置。

log4j.logger.log.SYSTEM_LOG=,SYSTEM_LOG
log4j.logger.log.OPERATE=,OPERATE
log4j.logger.log.REMOTE=,REMOTE

# SYSTEM_LOG
log4j.appender.SYSTEM_LOG=org.apache.log4j.RollingFileAppender
log4j.appender.SYSTEM_LOG.File=E:/icloud/log/SYSTEM_LOG.log
log4j.appender.SYSTEM_LOG.encoding=UTF-8
log4j.appender.SYSTEM_LOG.Threshold=all
log4j.appender.SYSTEM_LOG.MaxFileSize=50MB
log4j.appender.SYSTEM_LOG.MaxBackupIndex=10
log4j.appender.SYSTEM_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSTEM_LOG.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss} %m  %n

# REMOTE遠端通路
log4j.appender.REMOTE=org.apache.log4j.RollingFileAppender
log4j.appender.REMOTE.File=E:/icloud/log/REMOTE.log
   ......

# OPERATE 記錄檔
log4j.appender.OPERATE=org.apache.log4j.RollingFileAppender
log4j.appender.OPERATE.File=E:/icloud/log/OPERATE.log
    ......      

在Java代碼中,可以通過傳入對應參數來獲得制定的日志類。 

Logger system_log = log.getLogger("log.SYSTEM_LOG");
Logger operate = log.getLogger("log.OPERATE");
Logger remote = log.getLogger("log.REMOTE");      

其中,傳入的字元串參數即為log4j.logger.log.SYSTEM_LOG定義中的紅色部分。 

如果是不同包結構,也可以使用上述方式,不同的是字元串替換成包路徑。下面定義中,com.supermap.action和com.supermap.view分别代表不同的包。

log4j.logger.com.supermap.action=INOF,AppenderName1

log4j.logger.com.supermap.view=INOF,AppenderName2

擷取Log可以通過直接傳入包名的方式

Logger log = log.getLogger("com.supermap.action");

也可以通過對應包下的class,并且會通過包結構層級往上傳遞。下面兩者傳回統一的日志記錄目标相同。

Logger log = log.getLogger(com.supermap.action.DrawAction.class);

Logger log = log.getLogger(com.supermap.action.util.DrawActionTool.class);

2、我們也可以通過編寫代碼動态配置的方式來修改LogProperties中的資訊。

InputStream in = this.getClass().getClassLoader()
      .getResourceAsStream("com/supermap/tools/locationnormalise/log/log4j.properties");
 
Properties p = new Properties();
try {
   p.load(in);
   //預設日志路徑
   p.setProperty("log4j.appender.SYSTEM_LOG.File", filePath+"/SYSTEM_LOG.log");
   p.setProperty("log4j.appender.OPERATE.File", filePath+"/OPERATE.log");
   p.setProperty("log4j.appender.REMOTE.File", filePath+"/REMOTE.log");
   PropertyConfigurator.configure(p);
} catch (IOException e) {
   e.printStackTrace();
}      

3、最後,log4j.Properties中支援對環境變量的引用,可以通過更改環境變量來設定不同的日志記錄目标

       Log4j.appender.logfile.File=${WORKDIR}/logs/app.log

其中“${WORKDIR}/”是個變量,會被System Property中的“WORKDIR”的值代替。這樣,我們就可以在log4j加載配置檔案之前,先用System.setProperty設定好根路徑。