Java日志操作总结
Java日志操作總結
(2008-04-21 17:39:06)標簽: 雜談 | ? |
1.1. 概述
Apache的開源日志組件Jakarta CommonsLogging(JCL)提供的是一個日志(Log)接口(Interface),同時兼顧輕量級和不依賴于具體的日志實現工具。它提供給中間件/日志工具開發者一個簡單的日志操作抽象,允許程序開發人員使用不同的具體日志實現工具。用戶被假定已熟悉某種日志實現工具的更高級別的細節。JCL提供的接口,對其它一些日志工具,包括Log4J,Avalon LogKit, and JDK1.4等,進行了簡單的包裝。Commons-logging的目的是為“所有的JAVA日志實現”提供一個同一的接口,它本身的日志功能比較弱(只有一個簡單的SimpleLog實現類),所以一般不會單獨使用它,可以結合功能強大的Log4j使用。
?
1.2. 配置commons-logging
1.2.1???????????將commons-logging.jar導入工程,若使用log4j還需導入log4j-1.2.8.jar
1.2.2???????????JCL首先在classpath下尋找自己的配置文件commons-logging.properties,如果找到就是使用其中的Log實現類
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=trace
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
1.2.3???????????如果上面的步驟失敗,Commons的Logging接著檢查系統屬性org.apache.commons.logging.Log。
1.2.4???????????如果找不到org.apache.commons.logging.Log系統屬性,Logging接著在CLASSPATH中尋找log4j的類。如果找到了,Logging就假定應用要使用的是log4j。不過這時log4j本身的屬性仍要通過log4j.properties文件正確配置。
1.2.5???????????如果上述查找均不能找到適當的Logging API,但應用程序正運行在JRE1.4或更高版本上,則默認使用JRE 1.4的日志記錄功能。
1.2.6???????????最后,如果上述操作都失敗,則應用將使用內建的SimpleLog。SimpleLog把所有日志信息直接輸出到System.err。
1.3. 使用Log
1.3.1???????????導入所需的commons-logging類
| import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; |
??????????????????
1.3.2???????????利用LogFactory創建Log實例
| private static final Loglog =LogFactory.getLog(ApacheLoggingDemo.class); |
1.3.3???????????使用org.apache.commons.logging.Log類的成員方法輸出日志信息
| log.info("commons-logging infomessage"); log.debug("debug message"); log.error("error message"); log.warn("warnning message"); log.trace("trace message"); |
?
2.?? 使用JDK1.4Logger
2.1.概述
sun在JDK1.4提供了一個專門處理日志的記錄包:java.util.logging,它可以對程序中的日志記錄進行相當復雜的控制。例如:通過它可以指定日志級別和日志的位置(控制臺、文件、Email等),我們可以自己手動創建子記錄器,通過它可以用程序控制的方式來指定記錄的內容,也可以使用配置文件來指定,而不需要改動程序。
2.2.使用Logger
2.2.1???????????在工程中創建配置文件logging.properties,內容如下:
# "handlers" specifies a comma separated list oflog Handler
handlers =java.util.logging.FileHandler,java.util.logging.ConsoleHandler
??????????????
# Default global logging level.
.Level = INFO
?
# default file output is in user's homedirectory.
java.util.logging.FileHandler.pattern =runtime.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 2
java.util.logging.FileHandler.formatter =java.util.logging.XMLFormatter
# Limit the message that are printed on the consoleto INFO and above.
java.util.logging.FileHandler.level = INFO
java.util.logging.ConsoleHandler.formatter =java.util.logging.SimpleFormatter
?
說明:通過以上的配置,在處理日志時,就會將日志信息寫入runtime.log文件中,并且在控制臺也顯示,若在工程中沒有配置logging.properties文件,系統就會自動加載jre/lib/logging.properties配置文件內容,默認是ConsoleHandler意味著日志信息在控制臺顯示。
?
2.2.2???????????創建日志管理器LogManager實例并加載配置文件(logging.properties)
| LogManager logMgr = LogManager.getLogManager(); FileInputStream fin = new FileInputStream(newFile( ??????????????????????????????????"src/logging.properties")); logMgr.readConfiguration(fin); |
2.2.3???????????創建記錄器Logger,并將其添加到當前日志管理器?????????????????????????????
| log =Logger.getLogger(this.getClass().getName()); logMgr.addLogger(log); |
??????????????????????????????????
2.2.4???????????使用記錄器記錄日志
?????????????????????
| log.fine("the fine message"); log.warning("the warning message"); log.info("the info message"); log.severe("The severe message"); |
?
3.??使用Log4j
3.1. 概述
Log4j是Apache的一個開放源代碼項目,通過使用Log4j,我們可以控制日志信息輸送的目的地是控制臺、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIXSyslog守護進程等;我們也可以控制每一條日志的輸出格式;通過定義每一條日志信息的級別,我們能夠更加細致地控制日志的生成過程。
3.2. Log4j配置
3.2.1???????????加入log4j-1.2.8.jar到你的工程當中
3.2.2???????????在工程的classpath下創建log4j.properties配置文件,內容如下:
### direct log messages to stdout ###
log4j.rootLogger=info,stdout
log4j.rootLogger=debug,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{yyy-MM-ddHH:mm:ss } [%t] %5p %c{1}:%L - %m%n
?
#log4j.logger.org.hibernate=fatal
#log4j.logger.net.sf.hibernate=fatal
?
#log4j.logger.net.sf.hibernate.SQL=fatal
?
#log4j.logger.net.sf.hibernate.type=fatal
?
#log4j.logger.net.sf.hibernate.tool.hbm2ddl=fatal
?
# Set root logger level to DEBUG and its onlyappender to A1.
?
#log4j.rootLogger=debug, stdout, R
#log4j.rootLogger=debug,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 linenumber.
#log4j.appender.stdout.layout.ConversionPattern=%5p[%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
#log4j.appender.stdout.layout.ConversionPattern=%d[%t] %-5p %c - %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
?
# Print only messages of level WARN or above in thepackage com.foo.
#log4j.logger.com.foo=WARN
3.2.3???????????在輸出日志信息的類中使用Log4j
???????????????
得到Log實例還有另外一種方式(利用LogFactory):
| private static final Log logx =LogFactory.getLog(Log4jTest.class); |
??????????????????使用這種方式時要用到struts的commons-logging.jar
在實際應用中commons-logging+log4j無疑是最好的選擇
3.3. Log4j配置文件詳解
3.3.1???????根類別
配置根Logger,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName,...
level 是日志記錄的類別
appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。
類別level 為OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定義的優先級。
og4j常用的優先級FATAL>ERROR>WARN>INFO>DEBUG
配置根Logger,其語法為:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
如果為log4j.rootLogger=WARN,則意味著只有WARN,ERROR,FATAL被輸出,DEBUG,INFO將被屏蔽掉。
舉例:log4j.rootLogger=INFO,stdout,Runlog,Errorlog
根日志類別為INFO,DEBUG將被屏蔽,其他的將被輸出。stdout,Runlog,Errorlog分別為3個輸出目的地。
?
3.3.2???????常用輸出格式
-X號:X信息輸出時左對齊;
%p:日志信息級別
%d{}:日志信息產生時間
%c:日志信息所在地(類名)
%m:產生的日志具體信息
%n:輸出日志信息換行
舉例:
log4j.appender.stdout.layout.ConversionPattern=%5p%d{yyyy-MM-ddHH:mm:ss}
?
3.3.3???????輸出布局
使用的輸出布局,其中log4j提供4種布局:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以靈活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的級別和信息字符串),
org.apache.log4j.TTCCLayout(包含日志產生的時間、線程、類別等等信息)
舉例:
輸出格式為HTML表格
log4j.appender.stdout.layout=org.apache.log4j.HTMLLayout
3.3.4???????日志信息的輸出目的地
配置日志信息輸出目的地Appender,其語法為
log4j.appender.appenderName =fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
appenderName就是指定日志信息輸出到哪個地方。您可以同時指定多個輸出目的地。
log4j支持的輸出目的地:
org.apache.log4j.ConsoleAppender 控制臺
org.apache.log4j.FileAppender 文件
org.apache.log4j.DailyRollingFileAppender每天產生一個日志文件
org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生一個新的文件),
org.apache.log4j.WriterAppender(將日志信息以流格式發送到任意指定的地方)
org.apache.log4j.net.SMTPAppender 郵件
org.apache.log4j.jdbc.JDBCAppender 數據庫
其他如:GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIXSyslog守護進程等
舉例:
輸出到控制臺
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender(指定輸出到控制臺)
log4j.appender.Threshold=DEBUG(指定輸出類別)
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout(指定輸出布局)
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c-%-4r [%t] %-5p %c %x - %m%n(指定輸出格式)
輸出到文件
?log4j.appender.FILE=org.apache.log4j.FileAppender(指定輸出到文件)
?log4j.appender.FILE.File=file.log(指定輸出的路徑及文件名)
?log4j.appender.FILE.Append=false
?log4j.appender.FILE.layout=org.apache.log4j.PatternLayout(指定輸出的布局)
??log4j.appender.FILE.layout.ConversionPattern=[framework]%d - %c -%-4r [%t] %-5p %c %x - %m%n(指定輸出的格式)
輸出到文件(輪換"日志文件",當日志文件達到指定大小時,該文件就被關閉并備份,然后創建一個新的日志文件)
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender(指定輸出到文件)
log4j.appender.ROLLING_FILE.Threshold=ERROR(指定輸出類別)
log4j.appender.ROLLING_FILE.File=rolling.log(指定輸出的路徑及文件名)
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB(指定輸出到文件的大小)
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout(指定采用輸出布局)
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d- %c -%-4r [%t] %-5p %c %x - %m%n(指定采用輸出格式)
3.4. 修改日志級別
3.4.1???????在程序中修改
| private static final Loggerlog =Logger.getLogger(YouClassName.class); public static voidmodify(){ log.setLevel(Level.DEBUG); } |
通過Logger的setLevel方法來進行修改
Log4j日志的常用級別按優先級順序可以分為:
TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF
但常用的就只有5個:DEBUG,INFO,WARN,ERROR,FATAL
DEBUG:致命錯誤
ERROR:錯誤
WARN:警告
INFO:常用信息
DEBUG:調試信息
TRACE:細節
3.4.2???????通過配置文件修改
通過配置文件(log4j.properties)可以配置指定Logger類的日志顯示級別,如:
指定com.xx.foo.TestClass類中的日志級別為INFO,輸出為stdout定義:
Log4j.logger.com.xx.foo.TestClass = INFO,stdout
指定com.xx.foo包下的所有類的日志級別為DEBUG,輸出為stdout定義:
Log4j.logger.com.xx.foo = DEBUG,stdout
名稱為IAMLogInfo日志,日志級別為INFO,輸出目標為控制臺
Log4j.logger.IAMLogInfo = INFO,console
總結
以上是生活随笔為你收集整理的Java日志操作总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 核心API最佳实践——JDK日志分级
- 下一篇: Java中获取当前函数名