1,概述
org.apache.log4j.Logger //1996就有了,之后不斷完善
Java.util.logging //2000年發布接口,2002(JDK1.4)才有實現類
commons-logging//封裝兩者Log4JLogger, Jdk14Logger,並提供統一接口。
2, 不區分業務
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class TestLog4j {
public static void main( String[] args ) {
PropertyConfigurator.configure( "C:/workspace/wnj/src/testLog/log4j.properties" );
Logger logger = Logger.getLogger( TestLog4j.class );
for ( int i = 0; i < 11; i++ ) {
for ( int j = 0; j < 13; j++ ) {
logger.debug( "debug log-" + i + "-" + j );
}
logger.debug( "debug log-" + i + "-end" );
}
}
}
#log4j: logger,appender,layout
#根Logger的級別,Appender
log4j.rootLogger = DEBUG, stdout, RF
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d [%t] %c %-10p Message=%m%n
#定制appender的級別
log4j.appender.stdout.Threshold = INFO
#log4j.appender.RF = org.apache.log4j.RollingFileAppender
log4j.appender.RF = org.apache.log4j.DailyRollingFileAppender
log4j.appender.RF.layout = org.apache.log4j.PatternLayout
log4j.appender.RF.layout.ConversionPattern = %d [%t] %c %p Message=%m%n
#log.txt為項目根目錄下./log.txt
log4j.appender.RF.File=d:/logs/log.txt
#log4j.appender.RF.MaxFileSize=1KB
#文件個數
#log4j.appender.RF.MaxBackupIndex=10
#Patter 詳解
#%p: 輸出日志信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL,
#%d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921
#%r: 輸出自應用啟動到輸出該log信息耗費的毫秒數
#%c: 輸出日志信息所屬的類目,通常就是所在類的全名
#%t: 輸出產生該日志事件的線程名
#%l: 輸出日志事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main (TestLog4.java:10)
#%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
#%%: 輸出一個"%"字符
#%F: 輸出日志消息產生時所在的文件名稱
#%L: 輸出代碼中的行號
#%m: 輸出代碼中指定的消息,產生的日志具體信息
#%n: 輸出一個回車換行符,Windows平台為"/r/n",Unix平台為"/n"輸出日志信息換行
#可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
#1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,默認的情況下右對齊。
#2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,"-"號指定左對齊。
#3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會有空格。
#4)%20.30c:如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字符,就從左邊較遠輸出的字
#Rolling rotation 文件內容不重不漏。
#日期按最新排序log.txt>log.txt.1>log.txt.2>...>log.txt.10
#第二天到來時先改為log.txt.2013-11-22,再生產一個新的log.txt
#log.txt(當天)> log.txt.2013-11-22 > log.txt.2013-11-21
3, 多個線程同時寫,不會logger串行 ,應該是對文件(資源)進行了鎖,而不是對log方法synchronized。測試列子
public class ThreadA implements Runnable{
@Override
public void run() {
PropertyConfigurator.configure( "C:/workspace/wnj/src/testLog/log4j.properties" );
Logger logger = Logger.getLogger( ThreadA.class );
for(int i=0; i< 100; i++){
logger.debug( "it is ThreadAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA log - "+i );
}
}
}
public class ThreadB implements Runnable{
@Override
public void run() {
PropertyConfigurator.configure( "C:/workspace/wnj/src/testLog/log4j.properties" );
Logger logger = Logger.getLogger( ThreadB.class );
for(int i=0; i< 100; i++){
logger.debug( "it is ThreadBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB log - "+i );
}
}
}
public class TestLog4j {
public static void main( String[] args ) {
new Thread( new ThreadA() ).start();
new Thread( new ThreadB() ).start();
}
}
4, 使用commons-logging
使用Commons-logging的LogFactory獲取日志處理類時:
1) 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實現類;
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
2) 如果找不到commons-logging.properties文件,則在查找是否已定義系統環境變量org.apache.commons.logging.Log,找到則使用其定義的Log實現類;
如果在Tomact中可以建立一個叫 :CATALINA_OPTS 的環境變量
給 他的 值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn
3) 否則,查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日志實現類;
4) 否則,使用JDK自身的日志實現類(JDK1.4以后才有日志實現類);
5) 否則,使用commons-logging自己提供的一個簡單的日志實現類SimpleLog;
5,不同業務,不同文件,用到時再研究。
6,題外話:java class 如果找不到jvm可以繼續運行,比如org.apache.commons.logging.impl.Log4JLogger