Log4J是Apache的一个开放源代码项目,使用Log4j可以将日志输出到文件,OutputStream,java.io.Writer,远程Log4j服务器以及Unix Syslog守护进程。Log4j支持的语言版本:C,C++,C#,Java,Python,和PL/SQL等。
下面介绍Log4j的几个重要组件:
1、Log4j组件
又叫记录器组件,负责产生日志,并能对日志进行筛选,控制什么样的日志应该输出,什么样的日志应该被忽略。Log4j允许程序员定义多个记录器,但是有一个根记录器一直存在 (org.apache.log4j.Logger类),位于记录器层次的顶部,它永远存在且不能通过名字检索,可以通过org.apache.log4j.Logger类的静态方法getRootLogger()方法来获得,而其它的记录器则通过org.apache.log4j.Logger类的静态方法getRootLogger(String name)来实例化。
记录器还有一个重要属性就是日志级别,常用的日志级别有5类:DEBUG,INFO,WARN,ERROR,FATAL。不同的记录器有不同的日志级别,如果一个记录器没有指定日志级别,那么它将从最近的一个指定日志级别的祖先继承级别;如果一个记录器已经指定了日志级别,那么他将不会从它的祖先继承日志级别。为了确保所有记录器都有日志级别,根记录器都是总是有级别的。
Loggeer类中定义了生成日志的方法:debug(),info(),warn(),error(),fatal()。我们在打印日志的时候,只会打印出跟记录器同一日志级别或者更高级别的日志。例如,记录器示例logger定义的日志级别是WARN,那么如果调用,logger.warn("..."),logger.error("..."),logger.fatal("...")将产生日志信息,如果调用logger.debug("..."),logger.info("...")则将被忽略。
log4j定义日志级别的好处:1、但我们用同样的名字调用getLogger(String name)方法,将总是返回同一个记录器对象的引用,这有利于我们在不同的代码或类中用同一个记录器记录日志的信息;2、一个记录器的祖先可以比后代记录器出现的晚,但会自动根据名字之间的关系建立这种家族关系。
2、Appender组件
Log4j中,信息通过Appender组件输出到目的地,一个Appender实例就表示一个输出目的地。
Log4j踢狗你给了一下几种Appender:
org.apacher.log4j.ConsoleAppender,输出目的地为控制台。
org.apacher.log4j.FileAppender,输出目的地为文件。
org.apacher.log4j.DailyRollingFileAppender,按照用户指定的时间或者日期频率滚动产生日志文件。
org.apacher.log4j.RollingFileAppender,当文件达到一定尺寸时,备份日志文件。
3、Layout组件
Layout组件负责格式化输出日志的信息,一个Appender只能有一个Layout。主要有如下几种Layout:
org.apache.log4j.SimpleLayout,SimpleLayout的输出有日志的级别+“_”+日志消息组成,例如DEBUG-hello world。
org.apache.log4j.HTMLLayout,以HTML表格的形式输出日志。
org.apache.log4j.XMLLayout,XMLLayout的输出有一系列在log4j.dtd中定义的<log4j:event>元素组成。
org.apache.log4j.TTCCLayout,TTCCLayout的输出由时间,线程,类别和嵌套的诊断上下文信息组成。
org.apache.log4j.PatternLayout,让程序员按照一定的转换格式指定日志信息的输出格式。
PatternLayout中常用的转换字符及其作用:
c——用于输出日志信息的类别
C——用于输出日志请求的调用者的完整限定名
d——用于输出日志事件的日期,在d字符后面还可以跟上日期格式说明符。例如%d{HH:mm:ss,SSS},如果咩有给出日期格式说明符,那么将使用ISO8601格式,"YYYY-MM-dd HH:mm:ss,SSS"格式
L——用于输出发出日志请求所在的源文件的行号。
m——用于输出由应用程序提供的与这个日志事件相关的消息。
n——用于输出特定平台的行分隔符
p——用于输出日志事件的级别
r——用于输出从应用程序开始直到日志事件产生流逝的毫秒数
t——用于输出产生日志事件的名字
%——序列“%%”,将输出一个单独的%