Java日志操作总结

来源:互联网 发布:ecap摄像头软件 编辑:程序博客网 时间:2024/04/28 17:26

Java日志操作总结

(2008-04-21 17:39:06)
标签:

杂谈

 
 使用Jakarta Commons Logging(JCL)

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


原创粉丝点击