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