Log4j學(xué)習(xí)和總結(jié)

在應(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!!!");

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容