Log4j的简介
日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录。
log4j的特性列表:
在运行速度方面进行了优化
使用基于名称的日志(logger)层次结构
是fail-stop的
是线程安全的
不受限于预定义的实用工具集
可以在运行时使用property和xml两种格式的文件来配置日志记录的行为
在一开始就设计为能够处理Java异常
能够定向输出到文件(file)、控制台(console)、java.io.OutputStream、java.io.Writer、远程服务器、远程Unix Syslog守护者、远程JMS监听者、NT EventLog或者发送e-mail
使用DEBUG、INFO、WARN、ERROR和FATAL五5个级别
可以容易的改变日志记录的布局(Layout)
输出日志记录的目的地和写策略可以通过实现Appender接口来改变
支持为每个日志(logger)附加多个目的地(appender)
提供国际化支持
Log4j中有三个主要的组件,它们分别是 Logger、Appender和Layout。
Log4j中将要输出的Log信息定义了5种级别,依次为DEBUG、INFO、WARN、ERROR、FATAL和OFF,如果配置OFF则不打印出任何信息。
当输出时,只有级别高过配置中规定的级别的信息才能真正的输出,这样就很方便的来配置不同情况下要输出的内容,而不需要更改代码。
Logger
Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。
有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法。
log4j.rootLogger=INFO, stdout, logfile
此句为将等级为INFO的日志信息输出到stdout和logfile这两个目的地,stdout和logfile的定义在下面的代码,可以任意起名。
可在配置文件中方便地配置存在继承关系的Logger组件,凡是在符号“.”后面的组件都会成为在符号“.”前面的Logger组件的子类。
例如:
log4j.logger.ParentLogger=WARN
log4j.logger.ParentLogger.SonLogger=,file
以上代码中, SonLogger是ParentLogger的子类Logger组件。
默认情况下,logger的additive标志被设置为true,表示未被分配level的logger将继承离他最近的父logger的所有appenders。该选项可以被重新设置,表示子logger将不再继承父logger的appenders。
logger以包为单位指定日志等级
log4j.logger.com.serlvet =DEBUG
指定com.servlet包下的所有类的等级为DEBUG。
Appender
Appender 则是用来指明将所有的log信息存放到什么地方,Log4j中支持多种appender,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。每个appender都和一个layout相联系;layout的任务是格式化用户的logging request。
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句为定义名为stdout的输出目的地是哪种类型,可以是
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
各种类型的Appender有特定的配置选项;具体可参照本文最后的示例,或查看官方文档。
Layout
Layout 的作用是控制Log信息的输出方式,也就是格式化输出的信息。
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句为定义名为stdout的输出端的layout是哪种类型,可以是
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
[QC]是log信息的开头,可以为任意字符,例如项目简称。
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2012年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:LogTest.main (LogTest.java:23)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个"%"字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。