Log4j工作流程

本文详细介绍了Log4j的功能特点及使用方法,包括其三大核心组件Logger、Appender和Layout的作用,以及如何通过配置文件灵活调整日志输出的级别、目的地和格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Log4j深入浅出--配置文件--方法--原理--流程

Log4j是Apache组织的一个开源项目,它是一个日志操作包,通过使用Log4j可以指定日志信息输出的目的地,如控制台,文件,GUI组件,NT的时间记录器,还可以控制每一条日志输出的格式,此外通过定义日志的级别,能够非常细致的控制日志的输出,最好的地方是这些功能可以通过一个配置文件来灵活的进行配置,而不需要修改程序代码.在应用程序中输出日志有三个目的:

1)     监视代码变量的变化情况,把详细信息记录到文件中,进行统计分析.

2)     跟踪代码运行轨迹,作为日后审计的依据.

3)     担当集成开发环境中的调试器的作用,向文件和控制器打印代码的调试信息.

学习Log4j最重要的是首先要了解两个常用的接口:Log和LogFactory.首先说一说Log接口.通用日志包把日志消息分为6个级别:

1)     fatal致命的

2)     error错误

3)     warn警告

4)     info信息

5)     debug调试

6)     trace细节

其中级别按照以上的顺序,org.apache.commons.logging.Log接口代表日志器,它提供

一组输出日志的方法.例如fatal(Object message)参数都是一个对象,要注意的是只有当它输出日志的级别大于或者等于为日志配置的级别的时候,这个方法才会被执行.Log接口还提供了一组判断是否允许输出特定级别日志信息的方法,很简单例如isFatalEnabled()在程序输出某种级别的日志消息之前,提倡先调用以上的方法来判断该级别的日志是否允许输出,这有助于提高应用的性能.这种判断主要是为了提高性能,避免执行多余的操作.

以上阐述了重要的Log接口,下面简单说明一下LogFactory接口,这个接口也和Log接口一样在logging包中,接口提供了获得日志器实例的两个静态方法如下:

public static Log getLog(String name)throws LogConfigurationException;

public static Log getLog(Class class)throws LogConfigurationException;

第一个getLog()方法name参数作为日志器的名字,第二个getLog()方法以class参数指定的类的名字作为日志器的名字.

在强调可重用组件的今天,除了自己从头到尾开发一个可重用的日志操作类以外,还有一个Apache为我们提供的一个强有力的现成的日志操作包Log4j.主要由三大组件构成:

1)     Logger:负责生成日志,并能够对日志信息进行分类筛选.

2)     Appender:定义了日志信息输出的目的地,指定日志信息应该被输出到什么地方.

3)     Layout:指定日志信息的输出格式.

以上的三个组件协同工作,使得开发者能够依据日志信息类别记录信息,并能够在程序运行期间,控制日志信息的输出格式以及日志的存放地点.Log4j的Appender组件决定日志输出到什么地方,目前Log4j的Appender支持将日志信息输出到控制台Console,文件,GUI组件.一个Logger可以同时对应多个Appender也就是说一个Logger的日志信息可以同时输出在多个目的地上.例如可以为rootLogger配置两个Appender,一个是file一个是console可以这样写:log4j.rootLogger=warn.file.console然后可以用appender.console或者是appender.file来指定具体的控制台或者文件.当以上的都设置好了以后还需要配置Layout组件,主要是解决日志的输出格式,它的类型有:HTMLLayout(html格式),PattemLayout(可以灵活的指定布局模式),SimpleLayout(包含日志信息级别和信息的字符串)TTCCLayout(包含日志生产时间,线程和类别等信息).通过如上的研究已经可以配置Log4j了,然后就可以通过Log4j的API来操作日志了.如果要在Web应用中使用Log4j,需要创建一个配置文件配置Log4j的环境,然后就可以在其他的Web组件中获取Logger对象并输出日志.下面展示一个局部的Log4j,这里只是举例Log4j的配置文件和在具体的Action中进行调用,如下:

1)     将Log4j的jar文件copy到WEB-INF的lib目录下.

2)     创建Log4j的配置文件log4j.properties存放在classes目录下.

Log4j.rootLogger=INFO,console,file

Log4j.appender.console=org.apache.log4j.ConsoleAppender

Log4j.appender.file=org.apache.log4j.RollingFileAppender

Log4j.appender.file=e:/log/log.txt

Log4j.appender.console.layout=org.apache.log4j.PattemLayout

Log4j.appender.console.layout.ConversionPattrm=%t%p-%m%n

Log4j.appender.file.layout=rog.appache.log4j.HTMLLayout

Log4j.appender.file.layout.ConversionPattem=%t%p-%m%n

配置文件配置好了,在Action里调用我就不用详细写了,很简单,就是引入logging的包,然后在execute()方法中通过Log log=LogFactory.getLog(“name”);获取具体的Log对象,在通过log.fatal(“信息”);类似的方法操作日志,还可以通过isDebugEnbled()等方法判断日志的输出.

    回顾一下Log4j主要三个组件构成:Logger,Appender,Layout,Logger控制日志信息的输出,Appender决定输出的目的地,Layout决定日志输出的格式.Log4j允许客户在配置文件文件中灵活的配置这些组件,然后读取配置文件中并配置Log4j环境,然后就可以在程序中任何要输出日志的地方调用适当的方法,这样对于日后程序的调试有着重大的作用.

log4j.properties-------------------

log4j.rootLogger = [DEBUG],CONSOLE
# level=ERROR、WARN、INFO、DEBUG


log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
#  org.apache.log4j.ConsoleAppender(控制台),
#  org.apache.log4j.FileAppender(文件),
#  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
#  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
#  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
#  org.apache.log4j.HTMLLayout(以HTML表格形式布局),
#  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

log4j.appender.CONSOLE.layout.ConversionPattern=-[%p]-[%l]- %m%n
#    %m:产生的日志具体信息
#   %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#  %r 输出自应用启动到输出该log信息耗费的毫秒数
#  %c 输出所属的类目,通常就是所在类的全名
#  %t 输出产生该日志事件的线程名
#  %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
#  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
#  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

log4j的一些配置属性-----------

1.layout属性

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

2.级别

Log4J中的一个核心概念是日志级别是有序的。Log4J内置了5种日志级别为:

DEBUG < INFO < WARN < ERROR < FATAL

右边的级别比左边的高。每一个Logger实例都有一个日志级别,上面的5种输出方法就是对应于5种不同级别的日志请求。比如,如果c是一个Logger实例,c.info("some information")就是一个INFO级别的日志请求。一个日志请求会不会输出,取决于该Logger实例的日志级别和该日志请求级别的比较。规则如下:
假如在一个级别为p的Logger实例中发生一个级别为q的日志请求,则当q >= p时请求才会启用

apche通用日志包和log4j使用指南--------

Apache通用日志包提供一组通用的日志接口,用户可以自由选择实现日志接口的第三方软件
通用日志目前支持以下日志实现
Log4j日志器
JDK1.4Logging
SimpleLog日志器
NoOpLog日志器

Log 接口
通用日志包把日志消息分为6种级别Fatal,Error,Warn,Info,Debug和Trace

org.apache.commons.logging.Log接口代表日志器,它提供了一组输出日志的方法
    fatal(Object message);
    error(Object message);
    warn (Object message);
    info (Object message);
    debug(Object message);
    trace(Object message);
   这里需要注意的是,只有当输出日志的级别大于等于日志器配置的日志级别时,这个方法
   才会真正被执行.例如日志器设置日志级别为Warn,那么程序中,它的
   fatal(),error(),warn()方法会被执行,而info(),debug(),trace()
   不会被执行.
  
   Log接口还提供了一组判断是否允许输出特定级别日志消息的方法
    isFatalEnable();
    isErrorEnable();
    isWarnEnable();
    isInfoEnable();
    isDebugEnable();
    isTraceEnable();
   
   LogFactory接口
  
   org.apache.commons.logging.LogFactory接口提供了获得日志器实例的两个静态方法
    public static Log getLog(String name)throws LogConfigurationException
    public static Log getLog(Class class)throws LogConfigurationException
   
    public static Log getLog(Class class)
    {
     getLog(class.getName());
    }


Log4J 日志器

Log4J 是Apache的一个开放源代码的项目.

Log4J由三大组件构成

Logger: 负责生成日志,并能根据配置的日志器级别来决定什么日志消息应该被输出.

Appender: 定义日志消息输出的目的地,指定日志消息应该被输出到什么地方,
这些地方可以是控制台,文件和网络设备等.

Layout:指定日志消息的输出格式

         配置通用日志接口

在web应用中使用通用日志包,首先必须进行以下配置

准备有关的jar文件
在commons-logging.properties 属性文件中指定日志器(即日志实线类)
为特定的日志器设置日志级别,输出格式和输出地点等.

准备有关jar文件
这里主要是准备 commons-logging.jar和 log4j.jar 放到lib目录下

指定日志器

通用日志接口从名为 commons-logging.properties的属性文件中获取实现日志
接口的日志器信息,这个文件放在web-inf/class目录下
在该文件的org.apache.commons.logging.Log属性指定日志实现类
例如用Log4J日志器,那么设置
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog

设置日志器属性

多数日志器允许以配置的方式,指定日志器的输出格式,地点,或者级别.
配置Log4J
Log4J,由三个重要的组件构成,Logger,Appender和Layout.
Log4J支持两种配置文件格式:一种是XML格式文件,一种是java属性文件.

配置Log4J组件
Logger组件支持继承关系,所有的Logger组件都直接或者间接继承rootLogger,
配置rootLogger的语法为
log4j.rootLogger=[priority],appenderName,appenderName,..

其中priority是日志级别,可选值OFF,FATAL,ERROR,WARN,INFO,DEBUG,TRACE和ALL
appenderName指定Appender组件,用户可以同时指定多个Appender组件,例如
以下代码指定rootLogger的日志级别为INFO,它有两个Appender,名为console和flie
log4j.rootLogger=INFO,console,file

配置Appender组件
配置日志消息输出目的地Appender,有以下几种
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸的时候产生一个新文件)
org.apache.log4j.WriterAppender(将日志信息以流个格式发送到任意指定的地方)

例如以下代码定义了一个名了file的Appender,它把日志信息输出到log.txt文件
   log4j.appender.file=org.apache.log4j.RollingFileAppender
   log4j.appender.file.File=log.txt
  
配置Layout组件

Log4j提供下面几种Layout
org.apache.log4j.HTMLLayout(以html表格形式布局)
org.apache.log4j.PatterLayout(可以灵活的指定布局模式)
org.apache.log4j.SimpleLayout(包含日志消息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间线程和类别)

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息
  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
  %r 输出自应用启动到输出该log信息耗费的毫秒数
  %c 输出所属的类目,通常就是所在类的全名
  %t 输出产生该日志事件的线程名
  %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)


如果为名"file"的Appender配置PatterLayout布局,则可以采用如下代码
    log4j.appender.file.layout=org.apache.log4j.PatterLayout
    log4j.appender.file.layout.ConversionPattern=%t%p-%m%n
   
    采用以上PatternLayout布局,从日志文件中看到的输出日志的形式如下
      http8080-Processor24 INFO -This is an info message
    %t对应"http8080-Processor24" %p对应INFO,%m%n对应后面具体的日志消息
   
    一个简单的应用
  
   
    新建log4j.properties
    log4j.rootLogger=INFO,a
    log4j.appender.a=org.apache.log4j.RollingFileAppender
    log4j.appender.a.File=log.txt
    log4j.appender.a.layout=org.apache.log4j.SimpleLayout
   
    import org.apache.commons.logging.Log;
     import org.apache.commons.logging.LogFactory;

public class Log4JTest {

     /**
      * @param args
      */
     private static Log log=LogFactory.getLog(Log4JTest.class);
     public static void main(String[] args) {
         // TODO Auto-generated method stub
       log.info("aaa");
    
     }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值