在網(wǎng)上學(xué)習(xí)了一下Log4j,以下是一些簡單的學(xué)習(xí)筆記
Apache的開源項(xiàng)目Log4j是一個(gè)功能強(qiáng)大的日志組件,提供快速有效的日志記錄,開發(fā)者通過簡單的學(xué)習(xí),即可為自己的程序中加入非常實(shí)用的日志功能。
在apache網(wǎng)站:http://jakarta.apache.org/log4j 可以免費(fèi)下載到Log4j最新版本的軟件包,解壓,將其中打包好的的log4j-1.x.x.jar文件復(fù)制到classpath相關(guān)目錄下 。
一、快速體驗(yàn)
ok,現(xiàn)在就可以來體驗(yàn)一下Log4j的功能,按以下步驟在程序中快速加入了日志功能。
參看下面這個(gè)簡單的例子一:
第一步: 用import導(dǎo)入Log4j需要使用的相關(guān)的類
第二步: 定義獲取一個(gè)日志記錄器Logger的對(duì)象
第三步: 裝入Log4j的配置文件,或者使用缺省環(huán)境的配置
第四步:現(xiàn)在可以在你的程序中想輸出日志的地方,使用Logger類提供的以下方法,插入不同優(yōu)先級(jí)的日志了。
debug(Object message ) ;
info(Object message ) ;
warn(Object message ) ;
error(Object message ) ;
大功告成!是不是非常簡單呢?完全可以取代以前常用來調(diào)試程序的System.out.println("xxxxxxxxxxxx")這樣的語句,而且log4j可以通過自定義配置文件來靈活地對(duì)日志輸出的級(jí)別進(jìn)行控制。
#########################################
例子一:
package com.study;
/**導(dǎo)入Log4j需要使用的相關(guān)的類*/
import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;
/**
* <p>Title: Log4j例子</p>
* <p>Description: 快速在程序中使用Log4j</p>
* <p>Copyright: Copyright (c) 2004</p>
* @author Robin
* @version 1.0
*/
public class HelloLog4j {
//定義日志記錄器logger,所有的日志由它來負(fù)責(zé)記錄,
static Logger logger=Logger.getLogger(HelloLog4j.class.getClass());
public static void main(String[] args) {
//使用缺省環(huán)境來配置Log4j
BasicConfigurator.configure();
//使用配置文件來配置Log4j
//PropertyConfigurator.configure ( "D:\\testLog4j.properties" ) ;
//插入日志信息
logger.info("HelloLog4j開始執(zhí)行");
try {
HelloLog4j helloLog4j1 = new HelloLog4j();
int count=helloLog4j1.count(1,-32);
logger.debug("count的值為:"+count);
}
catch (Exception e) {
logger.error("error"+e.getMessage());
}
logger.info("HelloLog4j執(zhí)行完成");
}
/**
* 求兩整數(shù)數(shù)之和
* */
public int count(int a,int b) {
int add=a+b;
if (add<0){
logger.warn("兩數(shù)之和小于零");
}
return add;
}
}
#########################################
二、配置Log4j
我們可以通過自定義定義配置文件來對(duì)日志的輸出進(jìn)行動(dòng)態(tài)的控制。
Log4j支持兩種配置文件格式,一種是XML格式的文件,一種是Java特性文件(鍵=值)。
可以用以下方式來載入配置文件:
1、載入使用Java 鍵—值對(duì)的屬性文件編寫的配置文件。
PropertyConfigurator.configure ( String configFilename)
2、載入XML形式的配置文件
DOMConfigurator.configure ( String filename )。
看一個(gè)簡單的java屬性配置文件testLog4j.properties:
#########################################
#指定根Logger,及日志輸出級(jí)別,大于等于該級(jí)別的日志將被輸出( DEBUG < INFO < WARN < ERROR < FATAL ) 設(shè)為OFF可以關(guān)閉日志
log4j.rootLogger=DEBUG, A1,A2
#指定log輸出目的,這里設(shè)為輸出日志到指定目錄的文件my.log中
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=d:\\study\\my.log
#指定日志信息的格式
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%r %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n
#把A2輸出到控制臺(tái)
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.SimpleLayout
#還可以單獨(dú)指定輸出某個(gè)包的日志級(jí)別
#log4j.logger.com.study.HelloLog4j=INFO
#########################################
1、配置根Logger,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName2
level:日志的級(jí)別,指定這條日志信息的重要性。分為ALL < DEBUG < INFO < WARN <ERROR < FATAL < OFF
一般常用的為 DEBUG , INFO ,WARN ,ERROR四種,分別對(duì)應(yīng)Logger類的四種方法
debug(Object message ) ;
info(Object message ) ;
warn(Object message ) ;
error(Object message ) ;
如果設(shè)置級(jí)別為INFO,則優(yōu)先級(jí)大于等于INFO級(jí)別(如:INFO、WARN、ERROR)的日志信息將可以被輸出,小于該級(jí)別的如:DEBUG將不會(huì)被輸出
appenderName :就是指定日志信息輸出目的地,比如(打印到控制臺(tái),輸出到文件等)。同一條日志信息可以配置多個(gè)輸出目的地。
2、配置log輸出目的地
Log4j提供以下幾種:
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ā)送到任意指定的地方)
3、log信息的格式
org.apache.log4j.HTMLLayout(HTML表格形式)
org.apache.log4j.SimpleLayout(簡單格式的日志,只包括日志信息的級(jí)別和指定的信息字符串 ,如:DEBUG - Hello)
org.apache.log4j.TTCCLayout(日志的格式包括日志產(chǎn)生的時(shí)間、線程、類別等等信息)
org.apache.log4j.PatternLayout(靈活地自定義日志格式)
當(dāng)使用org.apache.log4j.PatternLayout來自定義信息格式時(shí),可以使用
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p -%m%n 來格式化信息
%c 輸出所屬類的全名,可寫為 %c{Num} ,Num類名輸出的范圍 如:"com.sun.aaa.classB", %C{2}將使日志輸出輸出范圍為:aaa.classB
%d 輸出日志時(shí)間其格式為 可指定格式 如 %d{HH:mm:ss}等
%l 輸出日志事件發(fā)生位置,包括類目名、發(fā)生線程,在代碼中的行數(shù)
%n 換行符
%m 輸出代碼指定信息,如info(“message”),輸出message
%p 輸出日志的優(yōu)先級(jí),即 FATAL ,ERROR 等
%r 輸出從啟動(dòng)到顯示該條日志信息所耗費(fèi)的時(shí)間(毫秒數(shù))
%t 輸出產(chǎn)生該日志事件的線程名
更詳細(xì)參數(shù)信息可參看類org.apache.log4j.PatternLayout的API doc文檔
關(guān)于性能:
加入日志總是會(huì)帶來一些性能損耗,當(dāng)然絕大多數(shù)情況下可以忽略不計(jì)。
1、當(dāng)某個(gè)級(jí)別的日志被屏蔽輸出時(shí),比如,配置級(jí)別為INFO,那么程序中DEBUG級(jí)別的日志語句將被禁止輸出
如:
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
以上語句中,雖然debug語句里的消息不會(huì)輸出到日志里,但消息中字符串構(gòu)造的操作依然會(huì)執(zhí)行,當(dāng)操作比較復(fù)雜時(shí),有時(shí)會(huì)帶來一些性能損耗,可以改成一下寫法:
if(logger.isDebugEnabled() {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
則一旦DEBUG級(jí)別被禁止輸出,則不會(huì)執(zhí)行日志信息后面的字符串操作。
2、由于日志記錄器Logger,支持命名的層次,所以在子層次向上查找繼承自父層次的日志級(jí)別時(shí),也可能會(huì)有一些性能損耗。
總之,Log4j的設(shè)計(jì)目標(biāo)已經(jīng)充份考慮到了速度優(yōu)先。經(jīng)過多次的改寫,性能問題已經(jīng)幾乎基本完全不是問題,它是一個(gè)非常優(yōu)秀的工具組件,使用它帶來的好處,大大多于失去的那一點(diǎn)點(diǎn)性能損耗。完全可以大膽使用。
============================================
commons-logging和log4j結(jié)合:http://dev.csdn.net/develop/article/29/29531.shtm
我在web-inf/classses目錄下建了commons-logging.properties和log4j.properties,我建了兩個(gè)appender,
commons-logging.properties內(nèi)容:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
log4j.properties內(nèi)容:
log4j.rootLogger=debug, dest1,dest2
log4j.appender.dest1=org.apache.log4j.ConsoleAppender
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout
log4j.appender.dest1.layout.ConversionPattern=%d %-5p %-5c{3} %x -> %m%n
log4j.appender.dest2=org.apache.log4j.RollingFileAppender
log4j.appender.dest2.File=c://bridge.log
log4j.appender.dest2.MaxFileSize=100KB
# Keep one backup file
log4j.appender.dest2.MaxBackupIndex=3
log4j.appender.dest2.layout=org.apache.log4j.PatternLayout
log4j.appender.dest2.layout.ConversionPattern=%d [%t] %-5p %-5c{3}(%L) %x -> %m%n