Log4j的介紹(轉)
一、前言:???? log4j (http://jakarta.apache.org/log4j/)是一個開放源碼項目,是廣泛使用的以Java編寫的日志記錄包。由于log4j出色的表現,當時在log4j完成時,log4j開發組織曾建議sun在jdk1.4中用log4j取代jdk1.4 的日志工具類,但當時jdk1.4已接近完成,所以sun拒絕使用log4j,當在java開發中實際使用最多的還是log4j,人們遺忘了sun的日志工具類.。它的一個獨有特性包括在類別中繼承的概念。通過使用類別層次結構,這樣就減少了日志記錄輸出量,并將日志記錄的開銷降到最低。
??
???? 它允許開發者控制以任意間隔輸出哪些日志語句。通過使用外部配置文件,完全可以在運行時進行配置。幾乎每個大的應用程序都包括其自己的日志記錄或跟蹤 API。經驗表明日志記錄是開發周期中的重要組成部分。同樣,日志記錄提供一些優點。首先,它可以提供運行應用程序的確切 上下文。一旦插入到代碼中,生成日志記錄輸出就不需要人為干涉。其次,日志輸出可以保存到永久媒體中以便以后研究。最后,除了在開發階段中使用,十分豐富的日志記錄包還可以用作審計工具。
??? 依照該規則,在 1996 年初,EU SEMPER(歐洲安全電子市場)項目就決定編寫自己的跟蹤 API。 在無數次改進、幾次具體化和許多工作之后,該 API 已經演變成 log4j,一種流行的 Java 日志記錄包。? 這個包按 IBM 公共許可證分發,由開放源碼權威機構認證。
??? 日志記錄有其自己的缺點。它會降低應用程序的速度。如果太詳細,它可能會使屏幕滾動變得看不見。? 為了減低這些影響,log4j 被設計成快速且靈活的。由于應用程序很少將日志記錄當作是主要功能,? log4j API 力爭易于了解和使用。
???? log4j,它可以控制以任意間隔輸出哪些日志語句。
二、主要組件
1、根類別(在類別層次結構的頂部,即全局性的日志級別)
?
配置根Logger,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
level 是日志記錄的類別
appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。
類別level 為 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定義的優先級。
og4j常用的優先級FATAL>ERROR>WARN>INFO>DEBUG
配置根Logger,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
如果為log4j.rootLogger=WARN,則意味著只有WARN,ERROR,FATAL被輸出,DEBUG,INFO將被屏蔽掉。
舉例:log4j.rootCategory=INFO,stdout,Runlog,Errorlog
根日志類別為INFO,DEBUG將被屏蔽,其他的將被輸出。 stdout,Runlog,Errorlog分別為3個輸出目的地。
?2、常用輸出格式
?-X號:X信息輸出時左對齊;
?%p:日志信息級別
?%d{}:日志信息產生時間
?%c:日志信息所在地(類名)
?%m:產生的日志具體信息
?%n:輸出日志信息換行
?舉例:
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
3、布局
使用的輸出布局,其中log4j提供4種布局:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
舉例:
輸出格式為HTML表格
log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout
輸出格式為可以靈活地指定布局模式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
輸出格式為包含日志信息的級別和信息字符串
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
輸出格式為包含日志產生的時間、線程、類別等等信息
log4j.appender.stdout.layout=org.apache.log4j.TTCCLayout
4、目的地
配置日志信息輸出目的地Appender,其語法為
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = valueN
appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。
log4j支持的輸出目的地:
org.apache.log4j.ConsoleAppender 控制臺
org.apache.log4j.FileAppender 文件
org.apache.log4j.DailyRollingFileAppender 每天產生一個日志文件
org.apache.log4j.RollingFileAppender (文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender (將日志信息以流格式發送到任意指定的地方)
org.apache.log4j.net.SMTPAppender 郵件
org.apache.log4j.jdbc.JDBCAppender 數據庫
其他如:GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等
舉例:
輸出到控制臺
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.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(指定輸出的格式)
輸出到文件(輪換"日志文件",當日志文件達到指定大小時,該文件就被關閉并備份,然后創建一個新的日志文件)
? 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
?log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender(指定輸出到Socket)
?log4j.appender.SOCKET.RemoteHost=localhost(遠程主機)
?log4j.appender.SOCKET.Port=5001(遠程主機端口)
?log4j.appender.SOCKET.LocationInfo=true
?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(輸出格式)
輸出到郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender(指定輸出到郵件)
?log4j.appender.MAIL.Threshold=FATAL
?log4j.appender.MAIL.BufferSize=10
?log4j.appender.MAIL.From=chunkyo@163.com(發件人)
?log4j.appender.MAIL.SMTPHost=mail.hollycrm.com(SMTP服務器)
?log4j.appender.MAIL.Subject=Log4J Message
?log4j.appender.MAIL.To=chunkyo@163.com(收件人)
?log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout(布局)
?log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n(格式)
?
輸出到數據庫
?log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender(指定輸出到數據庫)
?log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test(指定數據庫URL)
?log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver(指定數據庫driver)
?log4j.appender.DATABASE.user=root(指定數據庫用戶)
?log4j.appender.DATABASE.password=root(指定數據庫用戶密碼)
?log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')(組織SQL語句)
?log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout(布局)
?log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n(格式)
5、日志類別補充
有時我們需要對某個特定的部分指定有別于根類別的日志類別,可以指定某個包的優先級
如:
? log4j.category.com.neusoft.mbip.dm.util=ERROR ,其中com.neusoft.mbip.dm.util為我們需要特別指定日志類別的部分。
?
? 或者可以指定輸出文件的優先級
? log4j.appender.Errorlog.Threshold=ERROR
?
三、 常用log4j配置?
常用log4j配置,一般可以采用兩種方式,.properties和.xml,下面舉兩個簡單的例子:
1、log4j.properties
### 設置org.zblog域對應的級別INFO,DEBUG,WARN,ERROR和輸出地A1,A2 ##
log4j.category.org.zblog=ERROR,A1
log4j.category.org.zblog=INFO,A2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
### 設置輸出地A1,為ConsoleAppender(控制臺) ##
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
### 設置A1的輸出布局格式PatterLayout,(可以靈活地指定布局模式)##
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
### 配置日志輸出的格式##
log4j.appender.A2=org.apache.log4j.RollingFileAppender
### 設置輸出地A2到文件(文件大小到達指定尺寸的時候產生一個新的文件)##
log4j.appender.A2.File=E:/study/log4j/zhuwei.html
### 文件位置##
log4j.appender.A2.MaxFileSize=500KB
### 文件大小##
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.HTMLLayout
##指定采用html方式輸出
2、log4j.xml
<?xml version="1.0" encoding="GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="org.zblog.all" class="org.apache.log4j.RollingFileAppender">
<!-- 設置通道ID:org.zblog.all和輸出方式:org.apache.log4j.RollingFileAppender -->
??? <param name="File" value="E:/study/log4j/all.output.log" /><!-- 設置File參數:日志輸出文件名 -->
??? <param name="Append" value="false" /><!-- 設置是否在重新啟動服務時,在原有日志的基礎添加新日志 -->
??? <layout class="org.apache.log4j.PatternLayout">
??????? <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /><!-- 設置輸出文件項目和格式 -->
??? </layout>
</appender>
<appender name="org.zblog.zcw" class="org.apache.log4j.RollingFileAppender">
??? <param name="File" value="E:/study/log4j/zhuwei.output.log" />
??? <param name="Append" value="true" />
??? <param name="MaxFileSize" value="10240" /> <!-- 設置文件大小 -->
??? <layout class="org.apache.log4j.PatternLayout">
??????? <param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
??? </layout>
</appender>
<logger name="zcw.log"> <!-- 設置域名限制,即zcw.log域及以下的日志均輸出到下面對應的通道中 -->
??? <level value="debug" /><!-- 設置級別 -->
??? <appender-ref ref="org.zblog.zcw" /><!-- 與前面的通道id相對應 -->
</logger>
<root> <!-- 設置接收所有輸出的通道 -->
??? <appender-ref ref="org.zblog.all" /><!-- 與前面的通道id相對應 -->
</root>
</log4j:configuration>
3、配置文件加載方法:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;
public class Log4jApp {
??? public static void main(String[] args) {
??????? DOMConfigurator.configure("E:/study/log4j/log4j.xml");//加載.xml文件
??????? //PropertyConfigurator.configure("E:/study/log4j/log4j.properties");//加載.properties文件
??????? Logger log=Logger.getLogger("org.zblog.test");
??????? log.info("測試");
??? }
}
4、項目使用log4j
在web應用中,可以將配置文件的加載放在一個單獨的servlet中,并在web.xml中配置該servlet在應用啟動時候加載。
對于在多人項目中,可以給每一個人設置一個輸出通道,這樣在每個人在構建Logger時,用自己的域名稱,讓調試信
息輸出到自己的log文件中。
四、log4j配置舉例(properties)
#log4j.rootLogger = [ level ] , appenderName, appenderName,
#類別level 為 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定義的優先級
#Log4j常用的優先級FATAL>ERROR>WARN>INFO>DEBUG
#stdout為控制臺 ,Errorlog為錯誤記錄日志 ,
log4j.rootCategory=INFO,stdout,Runlog,Errorlog
#輸出的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.net.SMTPAppender 郵件
#org.apache.log4j.jdbc.JDBCAppender 數據庫
#定義輸出的形式
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.Runlog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.Errorlog=org.apache.log4j.DailyRollingFileAppender
#可以指定輸出文件的優先級
log4j.appender.Errorlog.Threshold=ERROR
#指定輸出的文件
log4j.appender.Runlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\runlog\\runlog.log
log4j.appender.Errorlog.File=D:\\UserInfoSyn\\WebRoot\\WEB-INF\\errorlog\\errorlog.log
#Log4j的layout布局
#org.apache.log4j.HTMLLayout 以HTML表格形式布局
#org.apache.log4j.PatternLayout 可以靈活地指定布局模式
#org.apache.log4j.SimpleLayout? 包含日志信息的級別和信息字符串
#org.apache.log4j.TTCCLayout??? 包含日志產生的時間、線程、類別等等信息
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.Runlog.layout=org.apache.log4j.PatternLayout
log4j.appender.Errorlog.layout=org.apache.log4j.PatternLayout
#輸出格式,log4j javadoc org.apache.log4j.PatternLayout
#-X號:X信息輸出時左對齊;
#%p:日志信息級別
# %d{}:日志信息產生時間
# %c:日志信息所在地(類名)
# %m:產生的日志具體信息
# %n:%n:輸出日志信息換行
log4j.appender.stdout.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Runlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
log4j.appender.Errorlog.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
#指定某個包的優先級
log4j.category.com.neusoft.mbip.dm.util=ERROR
#示例
###################
# 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
# Use this layout for LogFactor 5 analysis
########################
# Rolling File????? RollingFileAppender??????????????????
########################
#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.RollingFileAppender
#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
########################
# SMTP Appender
#######################
#log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
#log4j.appender.MAIL.Threshold=FATAL
#log4j.appender.MAIL.BufferSize=10
#log4j.appender.MAIL.From=chunkyo@163.com
#log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
#log4j.appender.MAIL.Subject=Log4J Message
#log4j.appender.MAIL.To=chunkyo@163.com
#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
########################
# Log Factor 5 Appender
########################
#log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
#log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
###################
#自定義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 = chunkyo@163.com
#log4j.appender.im.layout=org.apache.log4j.PatternLayout
#log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j 過濾日志級別
Please see detail for logconfig.xml. For filter only support xml.
You can use as following appender:
org.apache.log4j.ConsoleAppender ConsoleAppender
org.apache.log4j.FileAppender FileAppender
org.apache.log4j.jdbc.JDBCAppender JDBCAppender
org.apache.log4j.AsyncAppender AsyncAppender
org.apache.log4j.net.JMSAppender JMSAppender
org.apache.log4j.lf5.LF5Appender LF5Appender
org.apache.log4j.nt.NTEventLogAppender NTEventLogAppender
org.apache.log4j.varia.NullAppender NullAppender
org.apache.log4j.net.SMTPAppender SMTPAppender
org.apache.log4j.net.SocketAppender SocketAppender
org.apache.log4j.net.SocketHubAppender SocketHubAppender
org.apache.log4j.net.SyslogAppender SyslogAppender
org.apache.log4j.net.TelnetAppender TelnetAppender
org.apache.log4j.WriterAppender WriterAppender
For only one level deal:
You must user LevelRangeFilter and set LevelMin and LevelMax to the same level,
Note:The value must uppercase.
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
posted on 2007-03-23 09:35 liaojiyong 閱讀(436) 評論(0) 編輯 收藏 所屬分類: Java