前言
在Java 中實現記錄日志的方式有很多種,
1. 最簡單的方式,就是system.println.out(error) ,這樣直接在控制台打印消息了。
2. Java.util.logging ; 在JDK 1.4 版本之后,提供了日志的API ,可以往文件中寫日志了。
3. log4j , 最強大的記錄日志的方式。 可以通過配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。
4. commons-logging, 最綜合和常見的日志記錄方式, 經常是和log4j 結合起來使用。
Java.util.logging –JDK 記錄日志方式
system.print 這就不用多說了,直接看一下Java api 中 logging 日志的使用例子:
import java.io.IOException; import java.util.Date; import java.util.logging.FileHandler; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; public class TestLogJava { public static void main(String[] args) throws IOException{ Logger log = Logger.getLogger("tesglog"); log.setLevel(Level.ALL); FileHandler fileHandler = new FileHandler("testlog.log"); fileHandler.setLevel(Level.ALL); fileHandler.setFormatter(new LogFormatter()); log.addHandler(fileHandler); log.info("This is test java util log"); } } class LogFormatter extends Formatter { @Override public String format(LogRecord record) { Date date = new Date(); String sDate = date.toString(); return "[" + sDate + "]" + "[" + record.getLevel() + "]" + record.getClass() + record.getMessage() + "\n"; } }
這里是在eclipse 下code 和測試的。
首先定義一個Logeer的實例,並設置log 的級別,接着添加一個fileHander ,就是把日志寫到文件中。在寫入文件的時候,定義一個 LogFormatter對日志進行格式的渲染。
默認狀況下, 日志會打印到控制台。添加filehandler 后, 會同時寫入文件。 如不指定路徑,日志文件將位於項目根路徑下。
log4j 記錄日志方式
log4j 是apache 提供的記錄日志的jar 檔。
下載路徑:
http://logging.apache.org/log4j/1.2/download.html
這里要做的事情稍微要多一些:
1. 下載log4j 的jar 包,放入項目的lib 包中(添加到項目的build path中)。
2. 配置log4j.properties, 並放入項目的根路徑下.(也可以放入其他路徑,在讀的時候需要指定)
看一下一個配置實例:
### 設置日志級別 ###
log4j.rootLogger=debug,stdout,logfile
### 輸出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [ %p ] - [ %l ] %m%n
### 輸出到日志文件 ###
log4j.appender.logfile = org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File = log4j.log
log4j.appender.logfile.MaxFileSize = 512KB
log4j.appender.logfile.MaxBackupIndex = 3
log4j.appender.logfile.layout = org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %p ] - [ %l ] %m%n
這里指定了日志輸出的級別 debug.
stdout, logfile 指定日志輸出的目的地。 這兩個名字可以隨便取,比如 A, 或B都可以。 實際的配置是 org.apache.log4j.ConsoleAppender 和RollingFileAppender 用於指定是控制台還是文件。
另外還指定了輸出的格式, 已經產生的file 的規則。
3.測試java 文件
import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class TestLog4j { public static void main(String[] args) { // 1. create log Logger log = Logger.getLogger(TestLog4j.class); // 2. get log config file PropertyConfigurator.configure("log4j.properties"); // 3. start log log.debug("Here is some DEBUG"); log.info("Here is some INFO"); log.warn("Here is some WARN"); log.error("Here is some ERROR"); log.fatal("Here is some FATAL"); }
配置稍顯麻煩,但是code 時就簡單多了。
commons-logging寫日志方式
Commons-logging 也是Apache 提供的日志jar 檔。
下載地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi
你有可能要問為什么有了log4j還有提供Commons-logging呢? 這兩者有什么區別嗎?
其實從Commons-logging這個名字就可以看出來, 這應該是一個日志的共用接口。實際上, 它的確是這樣一個作用,
使用Commons-logging的LogFactory獲取日志處理類時:
1) 首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到,則使用其中定義的Log實現類;
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;
先使用第一種方式來看一個實例,配置commons-logging.properties, 使用log4j來記錄日志。
注意, commons-logging 要配合log4j 記錄日志,必須把log4j的jar 包也導入到項目中。
1. 導入log4j 和commons-logging的jar 包
2. 配置commons-logging.properties 和 log4j.properties, 放入項目的classpath下(也就是src目錄下)
注意: 單獨使用log4j 的時候,log4j.properties 默認是放在項目的根目錄下。
log4j.properties 的內容和上面完全相同。
看一下commons-logging.properties 的配置,一句話,指定使用log4j
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
3.測試代碼:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestLogCom {
static Log log = LogFactory.getLog(TestLog.class);
public static void main(String[] args) {
log.debug("Here is some DEBUG");
log.info("Here is some INFO");
log.warn("Here is some WARN");
log.error("Here is some ERROR");
log.fatal("Here is some FATAL");
}
}
除了使用log4j 之外, 還可以配置
org.apache.commons.logging.impl.Jdk14Logger 使用JDK1.4。
org.apache.commons.logging.impl.Log4JLogger 使用Log4J。
org.apache.commons.logging.impl.LogKitLogger 使用 avalon-Logkit。
org.apache.commons.logging.impl.SimpleLog common-logging自帶日志實現類。它實現了Log接口,把日志消息都輸出到系統錯誤流System.err 中。
org.apache.commons.logging.impl.NoOpLog common-logging自帶日志實現類。它實現了Log接口。 其輸出日志的方法中不進行任何操作。
總結
以上有一條
3) 否則,查看classpath中是否有Log4j的包,如果發現,則自動使用Log4j作為日志實現類;
項目同時導入log4j 和commons-logging的jar 包, 不需要配置commons-logging.properties ,只需要在classpath中配置 log4j.properties就可以使用log4j的方式記錄日志。這也是目前用的比較多的記錄日志的方式。
