所謂的Commons Logging接口,是指將日志功能的使用與日志具體實現分開,通過配置文件來指定具體使用的日志實現。這樣你就可以在Struts 1.1中通過統一的接口來使用日志功能,而不去管具體是利用的哪種日志實現,有點于類似JDBC的功能。Struts 1.1中支持的日志實現包括:Log4J,JDK Logging API, LogKit,NoOpLog和SimpleLog。
你可以按照如下的方式來使用Commons Logging接口(可以參照Struts源文中的許多類實現):
package com.foo;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Foo {
private static Log log = LogFactory.getLog(Foo.class);
public void setBar(Bar bar) {
if (log.isTraceEnabled()) {
log.trace("Setting bar to " + bar);
}
this.bar = bar;
}
}
而開啟日志功能最簡單的辦法就是在WEB-INF/classes目錄下添加以下兩個文件:
commons-logging.properties文件:
# commons-logging.properties
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
simplelog.properties文件:
# Logging detail level,
# Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
org.apache.commons.logging.simplelog.defaultlog=fatal
這里我們采用的日志實現是SimpleLog,你可以在simplelog.properties文件指定日志明細的級別:trace,debug,info,warn,error和fatal,從trace到fatal錯誤級別越來越高,同時輸出的日志信息也越來越少。而這些級別是和org.apache.commons.logging.log接口中的方法一一對應的。這些級別是向后包含的,也就是前面的級別包含后面級別的信息。
Struts本身并沒有配置日志功能,日志功能由commons-logging實現。在Struts中對日志功能的使用遵循以下的步驟:
1、如果存在log4j,就使用log4j(默認)。
在WEB-INF/classes目錄下添加log4j.properties,即可啟用log4j。下面是一個與hibernate搭配的log4j.properties文件:
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:\\hhhibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout,file
log4j.logger.net.sf.hibernate=info
### log just the SQL
#log4j.logger.net.sf.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.net.sf.hibernate.type=info
### log schema export/update ###
log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug
### log cache activity ###
#log4j.logger.net.sf.hibernate.cache=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trace
2、如果存在JDK1.4, 使用JDK1.4。
3、如果兩者都不存在,就使用SimpleLog。
Commons Logging接口實現了日志功能的使用與日志具體實現的分離。這樣你在Struts 1.1中就可以通過統一的接口來使用日志功能,而不必關心日志功能是由哪種方案來實現。如果你需要Struts當前支持的日志實現方案,你可以參考 org.apache.commons.logging的文檔。如果你要在Struts中使用commons-logging功能,你就需要把所需的JAR文件加到到你的應用程序庫中。也許有時候你會問“我真的需要使用commons-logging嗎”。問題答案取決于實際項目的要求。如果你希望你的日志方案能夠輕易的改變日志實現方案而同時又對你的應用程序沒有什么影響,那么commons-logging會是一個非常好的選擇。
那么,我們如何在我的編碼過程中學習使用commons-logging呢?
在你的代碼中使用commons-logging是件簡單的事,你所做的就是加入兩個import,同時聲明一個logger。
package com.foo;
// ...
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
...
public class Foo {
// ...
private static Log log = LogFactory.getLog(Foo.class);\\
// ...
public void setBar(Bar bar) {
if (log.isTraceEnabled()) {
log.trace("Setting bar to " + bar);
}
this.bar = bar;\\
}
// ...
}
通常,我們會為每個類都生成唯一的一個logger。為了方便起見在我們給這個logger命名的時候希望這個對象的名稱能夠體現出這個logger是在哪個地方使用的。在這個例子中logger的名字是com.foo.Foo。這樣你通過logger的名字就可以很快地指向問題出現的地方。此外,你也可以方便地啟動/關閉日志功能。