为什么要记录日志
1. 监视代码中变量的变化情况,把数据周期性地记录到文件中供其他应用进行统计分析工作
2. 跟踪代码运行时轨迹,作为日后审计依据
3. 担当集成开发环境中的调试器,向文件或控制台打印代码的调试信息
Apache通用日志包概述
Apache通用日志包(Commons Logging package)是Apache的一个开放源代码项目,它提供了一组通用的日志接口,用户可以自由地选择实现日志接口的第三方软件,通用日志接口目前支持以下日志实现
L og4j 日志器
JDK 1.4 Logging 日志器
SimpleLog 日志器 (把日志消息输出到标准的系统错误流System.err)
NoOpLog 日志器 (不输出任何日志消息)
通用日志包中的两个常用接口为LogFactory和Log
Log接口
org.apache.commons.logging.Log 接口代表日志器,它提供了一组输出日志的方法
fatal(Object message):
error(Object messages):
warn(Object messages):
info(Object messages):
debug(Object messages):
trace(Object messages):
Log接口还提供了一组判断是否允许输出特定级别的日志消息的方法
isFatalEnabled()
isErrorEnabled()
isWarnEnabled()
isInfoEnabled()
isDebugEnabled()
isTraceEnabled()
在程序中输出某种级别的日志消息之前,提倡先调用以上方法来判断该日志级别的日志是否允许输出,这有助于提高应用的性能
LogFactory 接口
org.apache.commons.logging.LogFactory 接口提供了获得日志器实例的两个静态方法
public static Log getLog(String name) throws LogConfigurationException;
public static Log getLog(Class class) throws LogConfigurationException;
常用的日志实现
指定日志器
通用日志接口从名为”commons-logging.properties”的属性文件中获取实现日志接口的日志信息 org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog
Log4J 日志器
配置Log4J,需要分别设置它的Logger,Appender和Layout的属性
1. 配置Logger组件
Logger组件支持继承关系,所有的Logger 组件都直接或间接继承rootLogger.配置rootLogger的语法为
log4j.rootLogger=[priority],appenderName,appenderName,….
Priority是日志级别,可选值包括OFF,FATAL,ERROR,WARN,INFO,DEBUG,TRACE和ALL
appenderName指定Appender组件,用户可以同时指定多个Appender组件.
log4j.rootLogger=INFO,console,file
2. 配置Appender组件
配置日志消息输出目的地Appender,其语法为
log4j.appender.appenderName=fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1=value1
log4j.appender.appenderName.option2=value2
……
log4j.appender.appenderName.optionN=valueN
Log4J 提供的Appender 有以下几种
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定大小时产生一个新的文件)
org.apache.log4j.WriterAppender(将日志消息以流格式发送的任意指定的地方)
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.txt
3 配置Layout组件
配置Layout组件的语法为
log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1=value1
log4j.appender.appenderName.layout.option2=value2
……
log4j.appender.appenderName.layout.optionN=valueN
Log4J 提供的Layout有以下几种
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志消息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间,线程和类别等信息)
PatternLayout 可以让开发者依照ConversionPattern去定义输出格式
PatternLayout的格式
%r 自程序开始后消耗的毫秒数
%t 表示日志记录请求生成的线程
%p 表示日志语句的优先级别
%r 与日志请求相关的类别名称
%c 日志消息所在的类名
%m%n表示日志消息的内容
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%t %p - %m%n
Log4J的配置样本
##LOGGERS##
#define a logger named helloAppLogger
log4j.rootLogger=INFO,console,file
##APPENDERS##
#define an appender named console,which is set to be a ConsoleAppender
log4j.appender.console=org.apache.log4j.ConsoleAppender
#define an appender named file,which is set to be a RollingFileAppender
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.txt
##LAYOUTS##
#assign a SimpleLayout to console appender
log4j.appender.console.layout=org.apache.log4j.SimpleLayout
#assign a PatternLayout to file appender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%t %p -- %m%n
Log4J对应用性能的影响
日志输出的目的地: 例如把日志输出到控制台的速度和输出到文件系统的速度是不一样的
日志输出格式: 例如采用SimpleLayout输出日志消息比采用PatternLayout简单,因此速度更快
日志级别: 日志级别设置得越低,输出的日志内容越多,对性能的影响也很大
在JSP中访问通用日志接口
Apache提供了一个客户化Log标签库,通过它可以在Jsp文件中方便地访问通用日志接口,无需编写程序代码.使用Log标签库的前提条件是通用日志接口必须采用Log4J作为实现接口.
<%@ taglib uri=”/WEB-INF/taglibs-log.tld” prefix=”log” %>