通過網(wǎng)上查找資料和項目中的一些應(yīng)用,記錄一下Commons-logging + Log4j 的使用方法。
現(xiàn)在很多都是使用Commons-logging + Log4j 結(jié)合使用,而不是全部使用Log4j。common-logging,就可以自行決定在自己的應(yīng)用中采用何種實現(xiàn),并跟所依賴的jar包統(tǒng)一起來。
據(jù)common-logging的官方文檔,決定實現(xiàn)方式的策略如下:
1.首先查找org.apache.commons.logging.Log屬性,該屬性可以在java代碼中設(shè)置,更常見的是在classpath下的common-logging.properties文件中進(jìn)行設(shè)置
2.在系統(tǒng)屬性中查找org.apache.commons.logging.Log
3.如果類路徑中有l(wèi)og4j的jar包,則采用log4j實現(xiàn)
4.如果jdk版本為1.4,采用Jdk14Logger
5.采用common-logging提供的SimpleLog
所以只要在classpath中加入Log4j的jar,Commons-logging 后臺使用的還是Log4j作為日志實現(xiàn)類。單獨使用Log4j的時候需要初始化:
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class Log4j {
static Logger logger = Logger.getLogger(Log4j .class);
public static void main(String args[]) {
PropertyConfigurator.configure("log4j.properties");
logger.debug("DEBUG");
}
}
使用Commons-logging + Log4j 實現(xiàn)方法:.
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
class TestLog{
public static Log log = LogFactory.getLog(TestLog.class);
public static void testLog(){
log.debug("test Commons-logging + Log4j");
}
}
只要classpath有Log4j的jar,其實就是使用Log4j作為實現(xiàn)類,但是要注意的是log4j.properties一定要在classpath中,之前一直不知道程序是如何去找到log4j.properties的,后來才發(fā)現(xiàn)是通過classpath去找的,如果classpath中沒有具體配置,就是到當(dāng)前類所在目錄下去查找(不包括包文件夾)。
log4j.properties簡介:
log4j.rootCategory=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
說明:
①log4j.rootCategory = [ level ] , appenderName, appenderName,
其中,level 是日志記錄的優(yōu)先級,分為OFF,FATAL,ERROR,WA R N,INFO,DEBUG,
ALL或者您定義的級別.Log4j建議只使用四個級別,優(yōu)先級從高到低分別是ERROR,
WA R N,INFO,DEBUG.通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日
志信息的開關(guān).比如在這里定義了INFO級別,則應(yīng)用程序中所有DEBUG級別的日志信息
將不被打印出來.appenderName就是指定日志信息輸出到哪個地方.您可以同時指定多個
輸出目的地.
②配置日志信息輸出目的地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(每天產(chǎn)生一個日志文件),
org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時候產(chǎn)生一個新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
③配置日志信息的格式(布局),其語法為:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產(chǎn)生的時間,線程,類別等等信息)
④Log4J采用類似C語言中的printf函數(shù)的打印格式格式化日志信息,打印參數(shù)如下:
%m 輸出代碼中指定的消息
%p 輸出優(yōu)先級,即DEBUG,INFO,WA R N,ERROR,FATAL
%r 輸出自應(yīng)用啟動到輸出該log信息耗費的毫秒數(shù)
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出產(chǎn)生該日志事件的線程名
%n 輸出一個回車換行符,Windows平臺為"\r\n",Unix平臺為"\n"
%d 輸出日志時間點的日期或時間,默認(rèn)格式為ISO8601,也可以在其后指定格式,
比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
%l 輸出日志事件的發(fā)生位置,包括類目名,發(fā)生的線程,以及在代碼中的行數(shù).
這里有2點要說明的,
一是關(guān)于log4j.appender.R.File=example.log ,如果不給定絕對路徑的話,log文件的默認(rèn)路徑是user.dir,可以通過System.getProperty("user.dir")來得到。
而是關(guān)于%5p [%t] (%F:%L) - %m%n 5代表優(yōu)先級字符串占用幾個位置,%F代表文件名,%L代表行號。
使用xml來充當(dāng)配置,沒有去看過,所以也不了解,但是在網(wǎng)上也看到過依賴jar包里的log4j配置將自己應(yīng)用的log4j.properties屏蔽掉的問題,說是classpath中的jxls-core-0.9.5.jar中的log4j.xml,該配置優(yōu)先于他的log4j.properties,導(dǎo)致log4j.properties設(shè)置失效,不過不太了解是什么原因,但是有人給出了解決方案,
手工重新 configure一下:
org.apache.log4j.LogManager.resetConfiguration();
然后:
org.apache.log4j.PropertyConfigurator.configure("c:/yourlog4j.properties");
或者
org.apache.log4j.xml.DOMConfigurator.configure("c:/yourlog4j.xml");