java.util.logging log4j,Java核心代碼(十)日志log4j,java.util.logging,commons-logging

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值