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
1.2.2
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
1.2.4
1.2.5
1.2.6
1.3. 使用Log
1.3.1
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; |
1.3.2
private static final Loglog =LogFactory.getLog(ApacheLoggingDemo.class); |
1.3.3
log.info("commons-logging infomessage"); log.debug("debug message"); log.error("error message"); log.warn("warnning message"); log.trace("trace message"); |
2. 使用JDK1.4Logger
sun在JDK1.4提供了一个专门处理日志的记录包:java.util.logging,它可以对程序中的日志记录进行相当复杂的控制。例如:通过它可以指定日志级别和日志的位置(控制台、文件、Email等),我们可以自己手动创建子记录器,通过它可以用程序控制的方式来指定记录的内容,也可以使用配置文件来指定,而不需要改动程序。
2.2.1
# "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 logMgr = LogManager.getLogManager(); FileInputStream fin = new FileInputStream(newFile( logMgr.readConfiguration(fin); |
2.2.3
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
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
3.2.1
3.2.2
### 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
得到Log实例还有另外一种方式(利用LogFactory):
private static final Log logx =LogFactory.getLog(Log4jTest.class); |
在实际应用中commons-logging+log4j无疑是最好的选择
配置根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个输出目的地。
-X号:X信息输出时左对齐;
%p:日志信息级别
%d{}:日志信息产生时间
%c:日志信息所在地(类名)
%m:产生的日志具体信息
%n:输出日志信息换行
举例:
log4j.appender.stdout.layout.ConversionPattern=%5p%d{yyyy-MM-ddHH:mm:ss}
使用的输出布局,其中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
配置日志信息输出目的地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.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