在應(yīng)用程序中添加日志記錄總的來說基于三個(gè)目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析工作;跟蹤代碼運(yùn)行時(shí)軌跡,作為日后審計(jì)的依據(jù);擔(dān)當(dāng)集成開發(fā)環(huán)境中的調(diào)試器的作用,向文件或控制臺(tái)打印代碼的調(diào)試信息。
最普通的做法就是在代碼中嵌入許多的打印語句,這些打印語句可以輸出到控制臺(tái)或文件中,比較好的做法就是構(gòu)造一個(gè)日志操作類來封裝此類操作,而不是讓一系列的打印語句充斥了代碼的主體。http://logging.apache.org/log4j/官網(wǎng)地址
Log4j建議只使用四個(gè)級(jí)別,優(yōu)先級(jí)從高到低分別是 ERROR、WARN、INFO、DEBUG。通過在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定義了INFO級(jí)別,則應(yīng)用程序中所有DEBUG級(jí)別的日志信息將不被打印出來,也是說大于等于的級(jí)別的日志才輸出。
日志記錄的級(jí)別有繼承性,子類會(huì)記錄父類的所有的日志級(jí)別。
getLogger(class)的參數(shù)用途:追蹤產(chǎn)生此日志的類.
可以不用加載一個(gè)類,也可以傳字符串的,這是一種通用做法,比如
Logger logger = Logger.getLogger("MyLog");
logger.info("...");
那么Logger首先會(huì)去找log4j.properties中的log4j.category.MyLog對(duì)應(yīng)的Appender來寫日志,當(dāng)然如果你配置了rootAppender的話,且其他的Appender也存在,則都會(huì)寫入兩者的Appedner。
java中一般采用key-value隊(duì)的形式保存log4j的配置信息。log4j.rootLogger 是默認(rèn)配置,當(dāng)然也可以添加log4j.category.NewCategory = [level],appenderName1,appenderName2 當(dāng)Logger logger = Logger.getLogger("NewCategory"); 時(shí) 會(huì)將日志文件寫出至appenderName1 appenderName2指定的文件內(nèi)。
Logger.getLogger(String name); 將 name作為日志記錄的一個(gè)標(biāo)簽標(biāo)記 方便后續(xù)進(jìn)行分析處理,還原業(yè)務(wù)場(chǎng)景和運(yùn)行環(huán)境? 可以加入任何有意義的標(biāo)簽,方便后續(xù)分析
Logger.getLogger(SomeClass.class); 追蹤某一類的日志產(chǎn)生,在相應(yīng)的日志記錄中加上該類的標(biāo)簽,方便后續(xù)定位 分析 還原場(chǎng)景和運(yùn)行環(huán)境? 可以定位自己的類 也可以定位其他的類
Log4J的配置文件(Configuration File)就是用來設(shè)置記錄器的級(jí)別、存放器和布局的,它可接key=value格式的設(shè)置或xml格式的設(shè)置信息。通過配置,可以創(chuàng)建出Log4J的運(yùn)行環(huán)境。
# 應(yīng)用于控制臺(tái)? # 應(yīng)用于文件? # 應(yīng)用于文件回滾 # 應(yīng)用于 socket # 發(fā)送日志給郵件? # 用于數(shù)據(jù)庫? ? # 自定義 Appender Properties 代碼
# 省略根,只設(shè)置特定包的級(jí)別和目的地? ? 設(shè)置 特定包的級(jí)別和目的地
通過配置文件可知,我們需要配置 3 個(gè)方面的內(nèi)容:
1 、根目錄(級(jí)別和目的地);
2 、目的地(控制臺(tái)、文件等等);
3 、輸出樣式。
Logger - 日志寫出器 ,供程序員輸出日志信息
Appender - 日志目的地 ,把格式化好的日志信息輸出到指定的地方去
Layout - 日志格式化器 ,用來把程序員的 logging request 格式化成字符串
2 . Log4j 基本使用方法
Log4j 由三個(gè)重要的組件構(gòu)成:日志信息的優(yōu)先級(jí),日志信息的輸出目的地,日志信息的輸出格式 。日志信息的優(yōu)先級(jí)從高到低有 ERROR 、 WARN 、 INFO 、 DEBUG ,分別用來指定這條日志信息的重要程度;日志信息的輸出目的地指定了日志將打印到控制臺(tái)還是文件中;而輸出格式則控制了日志信息的顯示內(nèi)容。
1 、定義配置文件
其實(shí)您也可以完全不使用配置文件,而是在代碼中配置 Log4j 環(huán)境。但是,使用配置文件將使您的應(yīng)用程序更加靈活。 Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 Java 特性文件(鍵 = 值 properties 文件)。下面我們介紹使用 Java 特性文件做為配置文件的方法:
1 ) . 配置根 Logger ,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中, level 是日志記錄的優(yōu)先級(jí),分為 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 ALL 或者您定義的級(jí)別。 Log4j 建議只使用四個(gè)級(jí)別 ,優(yōu)先級(jí)從高到低分別是 ERROR 、 WARN 、 INFO 、 DEBUG 。通過在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定 義了 INFO 級(jí)別,則應(yīng)用程序中所有 DEBUG 級(jí)別的日志信息將不被打印出來 。 appenderName 就是指 B 日志信息輸出到哪個(gè)地方。您可以同時(shí)指定多個(gè)輸出目的地。
2 )配置日志信息輸出目的地 Appender ,其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class. 其中, Log4j 提供的 appender 有以下幾種:
1.org.apache.log4j.ConsoleAppender (控制臺(tái)),
2.org.apache.log4j.FileAppender (文件),
3.org.apache.log4j.DailyRollingFileAppender (每天產(chǎn)生一個(gè)日志文件),
4.org.apache.log4j.RollingFileAppender (文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)? ? 新的文件)
5.org.apache.log4j.WriterAppender (將日志信息以流格式發(fā)送到任意指定的地方)
3) . 配置日志信息的格式(布局),其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
其中, Log4j 提供的 layout 有以 e 幾種:
1.org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
2.org.apache.log4j.PatternLayout (可以靈活地指定布局模式),
3.org.apache.log4j.SimpleLayout (包含日志信息的級(jí)別和信息字符串),
4.org.apache.log4j.TTCCLayout (包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
Log4J 采用類似 C 語言中的 printf 函數(shù)的打印格式格式化日志信息,打印參數(shù)如下: %m 輸出代碼中指定的消息
%p 輸出優(yōu)先級(jí),即 DEBUG , INFO , WARN , ERROR , FATAL
%r 輸出自應(yīng)用啟動(dòng)到輸出該 log 信息耗費(fèi)的毫秒數(shù)
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個(gè)回車換行符, Windows 平臺(tái)為 “rn” , Unix 平臺(tái)為 “n”
%d 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為 ISO8601 ,也可以在其后指定格式,比如: %d{yyy MMM dd HH:mm:ss,SSS} ,輸出類似: 2002 年 10 月 18 日 22 : 10 : 28 , 921
%l 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例: Testlog4.main(TestLog4.java:10)
2. 在代碼中使用 Log4j
1. 得到記錄器
使用 Log4j ,第一步就是獲取日志記錄器,這個(gè)記錄器將負(fù)責(zé)控制日志信息。其語法為:
public static Logger getLogger( String name)
通過指定的名字獲得記錄器,如果必要的話,則為這個(gè)名字創(chuàng)建一個(gè)新的記錄器。 Name 一般取本類的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
2. 讀取配置文件
當(dāng)獲得了日志記錄器之后,第二步將配置 Log4j 環(huán)境,其語法為:
BasicConfigurator.configure () : 自動(dòng)快速地使用缺省 Log4j 環(huán)境。
PropertyConfigurator.configure ( String configFilename) :讀取使用 Java 的特性文件編寫的配置文件。
DOMConfigurator.configure ( String filename ) :讀取 XML 形式的配置文件。
3. 插入記錄信息(格式化日志信息)
當(dāng)上兩個(gè)必要步驟執(zhí)行完畢,您就可以輕松地使用不同優(yōu)先級(jí)別的日志記錄語句插入到您想記錄日志的任何地方,其語法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
1. 配置文件
Log4J配置文件的基本格式如下:
#配置根Logger
log4j.rootLogger? =? [ level ]? ,? 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
其中 [level] 是日志輸出級(jí)別,共有5級(jí):
FATAL? ? ? 0
ERROR? ? ? 3
WARN? ? ? 4
INFO? ? ? ? 6
DEBUG? ? ? 7
Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺(tái)),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
Layout:日志輸出格式,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
打印參數(shù): Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,如下:
%m? 輸出代碼中指定的消息
%p? 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r? 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c? 輸出所屬的類目,通常就是所在類的全名
%t? 輸出產(chǎn)生該日志事件的線程名
%n? 輸出一個(gè)回車換行符,Windows平臺(tái)為“/r/n”,Unix平臺(tái)為“/n”
%d? 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日? 22 : 10 : 28 , 921
%l? 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java: 10 )
2. 在代碼中初始化Logger:
1)在程序中調(diào)用BasicConfigurator.configure()方法:給根記錄器增加一個(gè)ConsoleAppender,輸出格式通過PatternLayout設(shè)為"%-4r [%t] %-5p %c %x - %m%n",還有根記錄器的默認(rèn)級(jí)別是Level.DEBUG.
2)配置放在文件里,通過命令行參數(shù)傳遞文件名字,通過PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通過環(huán)境變量傳遞文件名等信息,利用log4j默認(rèn)的初始化過程解析并配置;
4)配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件名等信息,利用一個(gè)特殊的servlet來完成配置。
3. 為不同的 Appender 設(shè)置日志輸出級(jí)別:
當(dāng)調(diào)試系統(tǒng)時(shí),我們往往注意的只是異常級(jí)別的日志輸出,但是通常所有級(jí)別的輸出都是放在一個(gè)文件里的,如果日志輸出的級(jí)別是BUG???那就慢慢去找吧。
這時(shí)我們也許會(huì)想要是能把異常信息單獨(dú)輸出到一個(gè)文件里該多好啊。當(dāng)然可以,Log4j已經(jīng)提供了這樣的功能,我們只需要在配置中修改Appender的Threshold 就能實(shí)現(xiàn),比如下面的例子:
[配置文件]
### set log levels ###
log4j.rootLogger = debug ,? stdout ,? D ,? E
### 輸出到控制臺(tái) ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =? %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
### 輸出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級(jí)別以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}? [ %t:%r ] - [ %p ]? %m%n
### 保存異常信息到單獨(dú)文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 異常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級(jí)別以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}? [ %t:%r ] - [ %p ]? %m%n
[代碼中使用]
public? class? TestLog4j? {
public? static? void? main(String[] args)? {
PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );
Logger logger? =? Logger.getLogger(TestLog4j. class );
logger.debug( " debug " );
logger.error( " error " );
}
}
運(yùn)行一下,看看異常信息是不是保存在了一個(gè)單獨(dú)的文件error.log中
看下面的代碼:
類Log4jUtils:
/**
* Created by li on 2015/5/23.
*/
public class Log4JUtils{
private static Logger logger =? null;
public static Logger getLogger(){
if (null == logger){
//Java8 廢棄了Reflection.getCallerClass()
logger = Logger.getLogger(Reflection.getCallerClass().getName());
logger.debug("調(diào)用者類名"+Reflection.getCallerClass().getName());
}
return logger;
}
}
修改類LoggerTest的代碼:
/**
* Created by li on 2015/5/24.
*/
public class LoggerTest {
//? ? private static Logger logger = Logger.getLogger(LoggerTest.class);
public static void main(String[] args) {
Log4JUtils.getLogger().debug("Hello World!");
}
}
另附一些詳細(xì)東西:
1.java 中的應(yīng)用
Logger.debug(Object message);// 調(diào)試信息
Logger.info(Object message);// 一般信息
Logger.warn(Object message);// 警告信息
Logger.error(Object message);// 錯(cuò)誤信息
Logger.fatal(Object message);// 致命錯(cuò)誤信息
2 、配置根 Logger ,其語法為:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level : 是日志記錄的優(yōu)先級(jí),分為 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 ALL 或者您定義的級(jí)別。 Log4j 建議只使用四個(gè)級(jí)別,優(yōu) 先級(jí)從高到低分別是 ERROR 、 WARN 、 INFO 、 DEBUG 。通過在這里定義的級(jí)別,您可以控制到應(yīng)用程序中相應(yīng)級(jí)別的日志信息的開關(guān)。比如在這里定 義了 INFO 級(jí)別,則應(yīng)用程序中所有 DEBUG 級(jí)別的日志信息將不被打印出來。
appenderName: 就是指定日志信息輸出到哪個(gè)地方。您可以同時(shí)指定多個(gè)輸出目的地。
例如: log4j.rootLogger = info,A1,B2,C3
3 、配置日志信息輸出目的地,其語法為:
log4j.appender.appenderName = fully.qualified.name.of.appender.class? //
"fully.qualified.name.of.appender.class" 可以指定下面五個(gè)目的地中的一個(gè):
1.org.apache.log4j.ConsoleAppender (控制臺(tái))
2.org.apache.log4j.FileAppender (文件)
3.org.apache.log4j.DailyRollingFileAppender (每天產(chǎn)生一個(gè)日志文件)
4.org.apache.log4j.RollingFileAppender (文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
5.org.apache.log4j.WriterAppender (將日志信息以流格式發(fā)送到任意指定的地方)
1.ConsoleAppender 選項(xiàng)
Threshold=WARN: 指定日志消息的輸出最低層次。
ImmediateFlush=true: 默認(rèn)值是 true, 意謂著所有的消息都會(huì)被立即輸出。
Target=System.err :默認(rèn)情況下是: System.out, 指定輸出控制臺(tái)
2.FileAppender 選項(xiàng)
Threshold=WARN: 指定日志消息的輸出最低層次。
ImmediateFlush=true: 默認(rèn)值是 true, 意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt: 指定消息輸出到 mylog.txt 文件。
Append=false: 默認(rèn)值是 true, 即將消息增加到指定文件中, false 指將消息覆蓋指定的文件內(nèi)容。
3.DailyRollingFileAppender 選項(xiàng)
Threshold=WARN: 指定日志消息的輸出最低層次。
ImmediateFlush=true: 默認(rèn)值是 true, 意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt: 指定消息輸出到 mylog.txt 文件。
Append=false: 默認(rèn)值是 true, 即將消息增加到指定文件中, false 指將消息覆蓋指定的文件內(nèi)容。
DatePattern='.'yyyy-ww: 每周滾動(dòng)一次文件 ,即每周產(chǎn)生一個(gè)新的文件。當(dāng)然也可以指定按月、周、天、時(shí)和分。即對(duì)應(yīng)的格式如下:
1)'.'yyyy-MM: 每月
2)'.'yyyy-ww: 每周
3)'.'yyyy-MM-dd: 每天
4)'.'yyyy-MM-dd-a: 每天兩次
5)'.'yyyy-MM-dd-HH: 每小時(shí)
6)'.'yyyy-MM-dd-HH-mm: 每分鐘
4.RollingFileAppender 選項(xiàng)
Threshold=WARN: 指定日志消息的輸出最低層次。
ImmediateFlush=true: 默認(rèn)值是 true, 意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt: 指定消息輸出到 mylog.txt 文件。
Append=false: 默認(rèn)值是 true, 即將消息增加到指定文件中, false 指將消息覆蓋指定的文件內(nèi)容。
MaxFileSize=100KB: 后綴可以是 KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來的內(nèi)容移到 mylog.log.1 文件。
MaxBackupIndex=2: 指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
實(shí)際應(yīng)用:
log4j.appender.A1=org.apache.log4j.ConsoleAppender // 這里指定了日志輸出的第一個(gè)位置 A1 是控制臺(tái) ConsoleAppender
3 、配置日志信息的格式,其語法為:
A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
"fully.qualified.name.of.layout.class" 可以指定下面 4 個(gè)格式中的一個(gè):
1.org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
2.org.apache.log4j.PatternLayout (可以靈活地指定布局模式),
3.org.apache.log4j.SimpleLayout (包含日志信息的級(jí)別和信息字符串),
4.org.apache.log4j.TTCCLayout (包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
1.HTMLLayout 選項(xiàng)
LocationInfo=true: 默認(rèn)值是 false, 輸出 java 文件名稱和行號(hào)
Title=my app file: 默認(rèn)值是 Log4J Log Messages.
2.PatternLayout 選項(xiàng)
ConversionPattern=%m%n : 指定怎樣格式化指定的消息。
3.XMLLayout? 選項(xiàng)
LocationInfo=true: 默認(rèn)值是 false, 輸出 java 文件和行號(hào)
實(shí)際應(yīng)用:
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
這里需要說明的就是日志信息格式中幾個(gè)符號(hào)所代表的含義:
- X 號(hào) : X 信息輸出時(shí)左對(duì)齊;
%p: 輸出日志信息優(yōu)先級(jí),即 DEBUG , INFO , WARN , ERROR , FATAL,
%d: 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為 ISO8601 ,也可以在其后指定格式,比如: %d{yyy MMM dd HH:mm:ss,SSS} ,輸出類似: 2002 年 10 月 18 日 22 : 10 : 28 , 921
%r: 輸出自應(yīng)用啟動(dòng)到輸出該 log 信息耗費(fèi)的毫秒數(shù)
%c: 輸出日志信息所屬的類目,通常就是所在類的全名
%t: 輸出產(chǎn)生該日志事件的線程名
%l: 輸出日志事件的發(fā)生位置,相當(dāng)于 %C.%M(%F:%L) 的組合 , 包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例: Testlog4.main(TestLog4.java:10)
%x: 輸出和當(dāng)前線程相關(guān)聯(lián)的 NDC( 嵌套診斷環(huán)境 ), 尤其用到像 java servlets 這樣的多客戶多線程的應(yīng)用中。
%%: 輸出一個(gè) "%" 字符
%F: 輸出日志消息產(chǎn)生時(shí)所在的文件名稱
%L: 輸出代碼中的行號(hào)
%m: 輸出代碼中指定的消息 , 產(chǎn)生的日志具體信息
%n: 輸出一個(gè)回車換行符, Windows 平臺(tái)為 "/r/n" , Unix 平臺(tái)為 "/n" 輸出日志信息換行
可以在 % 與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
1)%20c :指定輸出 category 的名稱,最小的寬度是 20 ,如果 category 的名稱小于 20 的話,默認(rèn)的情況下右對(duì)齊。
2)%-20c: 指定輸出 category 的名稱,最小的寬度是 20 ,如果 category 的名稱小于 20 的話, "-" 號(hào)指定左對(duì)齊。
3)%.30c: 指定輸出 category 的名稱,最大的寬度是 30 ,如果 category 的名稱大于 30 的話,就會(huì)將左邊多出的字符截掉,但小于 30 的話也不會(huì)有空格。
4)%20.30c: 如果 category 的名稱小于 20 就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于 30 字符,就從左邊交遠(yuǎn)銷出的字符截掉。
這里上面三個(gè)步驟是對(duì)前面 Log4j 組件說明的一個(gè)簡(jiǎn)化;下面給出一個(gè)具體配置例子,在程序中可以參照?qǐng)?zhí)行:
log4j.rootLogger=INFO,A1 , B2
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
4. # 當(dāng)輸出信息于回滾文件時(shí)
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender? // 指定以文件的方式輸出日志
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log? // 文件位置 , 也可以用變量 ${java.home} 、 rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB? // 文件最大尺寸
log4j.appender.ROLLING_FILE.MaxBackupIndex=1? // 備份數(shù)
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
5. Log4j 比較全面的配置
LOG4J 的配置之簡(jiǎn)單使它遍及于越來越多的應(yīng)用中了: Log4J 配置文件實(shí)現(xiàn)了輸出到控制臺(tái)、文件、回滾文件、發(fā)送日志郵件、輸出到數(shù)據(jù)庫日志表、自定義標(biāo)簽等全套功能。擇其一二使用就夠用了,
log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true
# 應(yīng)用于控制臺(tái)
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
# 應(yīng)用于文件
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
# 應(yīng)用于文件回滾
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log? // 文件位置 , 也可以用變量 ${java.home} 、 rolling.log
log4j.appender.ROLLING_FILE.Append=true? ? ? //true: 添加? false: 覆蓋
log4j.appender.ROLLING_FILE.MaxFileSize=10KB? // 文件最大尺寸
log4j.appender.ROLLING_FILE.MaxBackupIndex=1? // 備份數(shù)
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
# 應(yīng)用于 socket
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
# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
# 發(fā)送日志給郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
www.wuset.com ">log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
www.wusetu.com ">log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# 用于數(shù)據(jù)庫
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 = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
【示例 7 】 【企業(yè)應(yīng)用】設(shè)置 特定包的級(jí)別和目的地
先增加一個(gè)包,新建一個(gè)類:
Java 代碼
package com.coderdream.log4jDao;
import org.apache.log4j.Logger;
public class HelloDao {
private static Logger logger = Logger.getLogger(HelloDao.class);
public static void main(String[] args) {
//? 記錄 debug 級(jí)別的信息
logger.debug("This is debug message from Dao.");
//? 記錄 info 級(jí)別的信息
logger.info("This is info message from Dao.");
//? 記錄 error 級(jí)別的信息
logger.error("This is error message from Dao.");
}
}
如果這個(gè)類作為基類,如 J2EE 中的 BaseDao 、 BaseAction 、 BaseService 等等,則我們可以將各層的日志信息分類輸出到各個(gè)文件。
Properties 代碼
# 省略根,只設(shè)置特定包的級(jí)別和目的地
log4j.logger.com.coderdream.log4j =debug,appender1
log4j.logger.com.coderdream.log4jDao =info,appender1,appender2
# 輸出到控制臺(tái)
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern =[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n
# 輸出到文件 ( 這里默認(rèn)為追加方式 )
log4j.appender.appender2=org.apache.log4j.FileAppender
log4j.appender.appender2.File=c:/Log4JDemo07_Dao.log
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n
實(shí)例演示:
Log4J的配置文件(Configuration File)就是用來設(shè)置記錄器的級(jí)別、存放器和布局的,它可接key=value格式的設(shè)置或xml格式的設(shè)置信息。通過配置,可以創(chuàng)建出Log4J的運(yùn)行環(huán)境。
1. 配置文件
Log4J配置文件的基本格式如下:
#配置根Logger
log4j.rootLogger? =? [ level ]? ,? 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
其中 [level] 是日志輸出級(jí)別,共有5級(jí):
FATAL? ? ? 0
ERROR? ? ? 3
WARN? ? ? 4
INFO? ? ? ? 6
DEBUG? ? ? 7
Appender 為日志輸出目的地,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender(控制臺(tái)),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
Layout:日志輸出格式,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
打印參數(shù): Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,如下:
%m? 輸出代碼中指定的消息
%p? 輸出優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL
%r? 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c? 輸出所屬的類目,通常就是所在類的全名
%t? 輸出產(chǎn)生該日志事件的線程名
%n? 輸出一個(gè)回車換行符,Windows平臺(tái)為“/r/n”,Unix平臺(tái)為“/n”
%d? 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},輸出類似:2002年10月18日? 22 : 10 : 28 , 921
%l? 輸出日志事件的發(fā)生位置,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main(TestLog4.java: 10 )
2. 在代碼中初始化Logger:
1)在程序中調(diào)用BasicConfigurator.configure()方法:給根記錄器增加一個(gè)ConsoleAppender,輸出格式通過PatternLayout設(shè)為"%-4r [%t] %-5p %c %x - %m%n",還有根記錄器的默認(rèn)級(jí)別是Level.DEBUG.
2)配置放在文件里,通過命令行參數(shù)傳遞文件名字,通過PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通過環(huán)境變量傳遞文件名等信息,利用log4j默認(rèn)的初始化過程解析并配置;
4)配置放在文件里,通過應(yīng)用服務(wù)器配置傳遞文件名等信息,利用一個(gè)特殊的servlet來完成配置。
3. 為不同的 Appender 設(shè)置日志輸出級(jí)別:
當(dāng)調(diào)試系統(tǒng)時(shí),我們往往注意的只是異常級(jí)別的日志輸出,但是通常所有級(jí)別的輸出都是放在一個(gè)文件里的,如果日志輸出的級(jí)別是BUG???那就慢慢去找吧。
這時(shí)我們也許會(huì)想要是能把異常信息單獨(dú)輸出到一個(gè)文件里該多好啊。當(dāng)然可以,Log4j已經(jīng)提供了這樣的功能,我們只需要在配置中修改Appender的Threshold 就能實(shí)現(xiàn),比如下面的例子:
[配置文件]
### set log levels ###
log4j.rootLogger = debug ,? stdout ,? D ,? E
### 輸出到控制臺(tái) ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =? %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
### 輸出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 輸出DEBUG級(jí)別以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}? [ %t:%r ] - [ %p ]? %m%n
### 保存異常信息到單獨(dú)文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/error.log ## 異常日志文件名
log4j.appender.D.Append = true
log4j.appender.D.Threshold = ERROR ## 只輸出ERROR級(jí)別以上的日志!!!
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}? [ %t:%r ] - [ %p ]? %m%n
[代碼中使用]
public? class? TestLog4j? {
public? static? void? main(String[] args)? {
PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );
Logger logger? =? Logger.getLogger(TestLog4j. class );
logger.debug( " debug " );
logger.error( " error " );
}
}
運(yùn)行一下,看看異常信息是不是保存在了一個(gè)單獨(dú)的文件error.log中
log4j.properties 使用
一.參數(shù)意義說明
輸出級(jí)別的種類
ERROR、WARN、INFO、DEBUG
ERROR 為嚴(yán)重錯(cuò)誤 主要是程序的錯(cuò)誤
WARN 為一般警告,比如session丟失
INFO 為一般要顯示的信息,比如登錄登出
DEBUG 為程序的調(diào)試信息
配置日志信息輸出目的地
log4j.appender.appenderName = fully.qualified.name.of.appender.class
1.org.apache.log4j.ConsoleAppender(控制臺(tái))
2.org.apache.log4j.FileAppender(文件)
3.org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
4.org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
5.org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
配置日志信息的格式
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的級(jí)別和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時(shí)間、線程、類別等等信息)
控制臺(tái)選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
Target=System.err:默認(rèn)情況下是:System.out,指定輸出控制臺(tái)
FileAppender 選項(xiàng)
Threshold=DEBUF:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
RollingFileAppender 選項(xiàng)
Threshold=DEBUG:指定日志消息的輸出最低層次。
ImmediateFlush=true:默認(rèn)值是true,意謂著所有的消息都會(huì)被立即輸出。
File=mylog.txt:指定消息輸出到mylog.txt文件。
Append=false:默認(rèn)值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內(nèi)容。
MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達(dá)該大小時(shí),將會(huì)自動(dòng)滾動(dòng),即將原來的內(nèi)容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以產(chǎn)生的滾動(dòng)文件的最大數(shù)。
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
日志信息格式中幾個(gè)符號(hào)所代表的含義:
-X號(hào): X信息輸出時(shí)左對(duì)齊;
%p: 輸出日志信息優(yōu)先級(jí),即DEBUG,INFO,WARN,ERROR,F(xiàn)ATAL,
%d: 輸出日志時(shí)間點(diǎn)的日期或時(shí)間,默認(rèn)格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%r: 輸出自應(yīng)用啟動(dòng)到輸出該log信息耗費(fèi)的毫秒數(shù)
%c: 輸出日志信息所屬的類目,通常就是所在類的全名
%t: 輸出產(chǎn)生該日志事件的線程名
%l: 輸出日志事件的發(fā)生位置,相當(dāng)于%C.%M(%F:%L)的組合,包括類目名、發(fā)生的線程,以及在代碼中的行數(shù)。舉例:Testlog4.main (TestLog4.java:10)
%x: 輸出和當(dāng)前線程相關(guān)聯(lián)的NDC(嵌套診斷環(huán)境),尤其用到像java servlets這樣的多客戶多線程的應(yīng)用中。
%%: 輸出一個(gè)"%"字符
%F: 輸出日志消息產(chǎn)生時(shí)所在的文件名稱
%L: 輸出代碼中的行號(hào)
%m: 輸出代碼中指定的消息,產(chǎn)生的日志具體信息
%n: 輸出一個(gè)回車換行符,Windows平臺(tái)為"/r/n",Unix平臺(tái)為"/n"輸出日志信息換行
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對(duì)齊方式。如:
1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,默認(rèn)的情況下右對(duì)齊。
2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小于20的話,"-"號(hào)指定左對(duì)齊。
3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大于30的話,就會(huì)將左邊多出的字符截掉,但小于30的話也不會(huì)有空格。
4)%20.30c:如果category的名稱小于20就補(bǔ)空格,并且右對(duì)齊,如果其名稱長(zhǎng)于30字符,就從左邊較遠(yuǎn)輸出的字符截掉。
二.文件配置Sample1
log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R
# ConsoleAppender 輸出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 輸出 一天一個(gè)文件,輸出路徑可以定制,一般在根路徑下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n
文件配置Sample2
下面給出的Log4J配置文件實(shí)現(xiàn)了輸出到控制臺(tái),文件,回滾文件,發(fā)送日志郵件,輸出到數(shù)據(jù)庫日志表,自定義標(biāo)簽等全套功能。
log4j.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
# Use this layout for LogFactor 5 analysis
########################
# 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.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
########################
# 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
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@yeqiangwei.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
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 = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
三.高級(jí)使用
實(shí)驗(yàn)?zāi)康模?/p>
1.把FATAL級(jí)錯(cuò)誤寫入2000NT日志
2. WARN,ERROR,F(xiàn)ATAL級(jí)錯(cuò)誤發(fā)送email通知管理員
3.其他級(jí)別的錯(cuò)誤直接在后臺(tái)輸出
實(shí)驗(yàn)步驟:
輸出到2000NT日志
1.把Log4j壓縮包里的NTEventLogAppender.dll拷到WINNT/SYSTEM32目錄下
2.寫配置文件log4j.properties
# 在2000系統(tǒng)日志輸出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.調(diào)用代碼:
Logger logger2 = Logger.getLogger("NTlog"); //要和配置文件中設(shè)置的名字相同
logger2.debug("debug!!!");
logger2.info("info!!!");
logger2.warn("warn!!!");
logger2.error("error!!!");
//只有這個(gè)錯(cuò)誤才會(huì)寫入2000日志
logger2.fatal("fatal!!!");
發(fā)送email通知管理員:
1. 首先下載JavaMail和JAF,
http://java.sun.com/j2ee/ja/javamail/index.html
http://java.sun.com/beans/glasgow/jaf.html
在項(xiàng)目中引用mail.jar和activation.jar。
2. 寫配置文件
# 將日志發(fā)送到email
log4j.logger.MailLog=WARN,A5
#? APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
3.調(diào)用代碼:
//把日志發(fā)送到mail
Logger logger3 = Logger.getLogger("MailLog");
logger3.warn("warn!!!");
logger3.error("error!!!");
logger3.fatal("fatal!!!");
在后臺(tái)輸出所有類別的錯(cuò)誤:
1. 寫配置文件
# 在后臺(tái)輸出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
2.調(diào)用代碼
Logger logger1 = Logger.getLogger("console");
logger1.debug("debug!!!");
logger1.info("info!!!");
logger1.warn("warn!!!");
logger1.error("error!!!");
logger1.fatal("fatal!!!");
--------------------------------------------------------------------
全部配置文件:log4j.properties
# 在后臺(tái)輸出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 在2000系統(tǒng)日志輸出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
# 將日志發(fā)送到email
log4j.logger.MailLog=WARN,A5
#? APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
全部代碼:Log4jTest.java
/*
* 創(chuàng)建日期 2003-11-13
*/
package edu.bcu.Bean;
import org.apache.log4j.*;
//import org.apache.log4j.nt.*;
//import org.apache.log4j.net.*;
/**
* @author yanxu
*/
public class Log4jTest
{
public static void main(String args[])
{
PropertyConfigurator.configure("log4j.properties");
//在后臺(tái)輸出
Logger logger1 = Logger.getLogger("console");
logger1.debug("debug!!!");
logger1.info("info!!!");
logger1.warn("warn!!!");
logger1.error("error!!!");
logger1.fatal("fatal!!!");
//在NT系統(tǒng)日志輸出
Logger logger2 = Logger.getLogger("NTlog");
//NTEventLogAppender nla = new NTEventLogAppender();
logger2.debug("debug!!!");
logger2.info("info!!!");
logger2.warn("warn!!!");
logger2.error("error!!!");
//只有這個(gè)錯(cuò)誤才會(huì)寫入2000日志
logger2.fatal("fatal!!!");
//把日志發(fā)送到mail
Logger logger3 = Logger.getLogger("MailLog");
//SMTPAppender sa = new SMTPAppender();
logger3.warn("warn!!!");
logger3.error("error!!!");
logger3.fatal("fatal!!!");
}
}