Log4j是Apache Jakarta的一个开源项目。
Log4j可以将日志信息输出到控制台、文件、GUI组件甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。
Log4j主要有3个组件,分别是:Loggers(记录器), Appenders(存放器)、 Layouts(布局)
日志消息可以按照级别和类型分类。
组件和日志消息配合使用可以在运行时中控制日志消息的输出以及输出格式等。
Log4j原理
记录器
继承
一个记录器可以通过名字认族归宗。比如说:fuck.A那个他就是fuck.A.abc的父亲。和Java一样,他也有一个类似Object的老祖宗叫做:Root,所以我们可以不必定义自己的记录器,直接使用这个Root
注意Root不能够被重复命名,也不能通过名称检索或引用,否则就会抛出异常信息。可以通过静态方法Logger.getRootLogger来引用Root。
下面是Logger类一些基本方法
package org.apache.log4j;
public class Logger {
// Creation & retrieval methods: public static Logger getRootLogger(); public static Logger getLogger(String name);
// printing methods: public void debug(Object message); public void info(Object message); public void warn(Object message); public void error(Object message); public void fatal(Object message);
// generic printing method: public void log(Level l, Object message); } |
因为所有的Logger都是继承Root而来,所以Root的属性应该全部被定义。看看下面官方文档提供的例子:
Logger | Assigned | Inherited |
root | Proot | Proot |
X | none | Proot |
X.Y | none | Proot |
X.Y.Z | none | Proot |
看上面这个例子,所有的子记录器都没有设置级别,所以所有的记录器的级别都和root的一样
Logger | Assigned | Inherited |
root | Proot | Proot |
X | Px | Px |
X.Y | Pxy | Pxy |
X.Y.Z | Pxyz | Pxyz |
看上面这个例子,当X继承root以后设置了一个新的级别Px,所以他的级别为Px,如果X.Y没有设置级别的话,这里他的级别应该是Px,但是在上面这个例子上X.Y的级别被重新设置成Pxy,所以他的级别也就是Pxy了。
Logger | Assigned | Inherited |
root | Proot | Proot |
X | Px | Px |
X.Y | none | Px |
X.Y.Z | Pxyz | Pxyz |
Logger | Assigned | Inherited |
root | Proot | Proot |
X | Px | Px |
X.Y | none | Px |
X.Y.Z | none | Px |
看上面这个例子,当X继承root以后设置了一个新的级别Px,所以他的级别为Px,而他的子子孙孙都没有设置级别,所以只要继承他的记录器都是Px
记录器的级别
记录器一个很重要的属性就是级别,系统已存在的级别有DEBUG、INFO、WARN、ERROR、FATAL五种级别,当然你也可以通过修改org.apache.log4j.Level
类来自己定义级别,但是在Log4j的官方文档中不推荐这种做法。但是可以用Level的继承类来定义自定义级别。
级别顺序为DEBUG < INFO < WARN < ERROR < FATAL
存放器和布局
存放器可以是控制台、文件、GUI组件甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程,他还可以是异步执行,,酷。
一个记录器可以使用多个存放器。
存放器的添加性
存放器的添加性就是一条C记录器的日志消息可以发送到C所有的存放器中,还可以发送到C的祖先们的存放器中。
Log4j中提供了一个配置属性,可以配置是否发送到祖先定义的存放器中。
如下:
Logger | Added | Additivity | Output Targets | Comment |
root | A1 | not applicable | A1 | The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root. |
x | A-x1, A-x2 | true | A1, A-x1, A-x2 | Appenders of "x" and root. |
x.y | none | true | A1, A-x1, A-x2 | Appenders of "x" and root. |
x.y.z | A-xyz1 | true | A1, A-x1, A-x2, A-xyz1 | Appenders in "x.y.z", "x" and root. |
security | A-sec | false | A-sec | No appender accumulation since the additivity flag is set to |
security.access | none | true | A-sec | Only appenders of "security" because the additivity flag in "security" is set to |
布局
用户往往希望不进能够定义存放器,最好还能够定义出存放的格式,所以在Log4j中就支持布局的配置。如下:"%r [%t] %-5p %c - %m%n"这就是一个配置(具体的含义在下面详解),他的输出应该是:
176 [main] INFO org.foo.Bar - Located nearest gas station.
Log4j应用
有几种方式可以配置Log4J
1)在程序中调用BasicConfigurator.configure()方法;
2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。
配置文件讲解如下:
# Set root logger level to DEBUG and its only appender to A1
#log4j中有五级logger
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7
#配置根Logger,其语法为:
#log4j.rootLogger = [ level ] , appenderName, appenderName, …
log4j.rootLogger=INFO, A1 ,R
#这一句设置以为着所有的log都输出,因为他这里的级别是INFO,也就是最低级别,所以所有的信息都输出
#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL
#被输出,DEBUG,INFO将被屏蔽掉.
# A1 is set to be a ConsoleAppender.
#log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等
#ConsoleAppender输出到控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 使用的输出布局,其中log4j提供4种布局. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
#灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout
#d 时间 ....
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
#R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。
log4j.appender.R=org.apache.log4j.RollingFileAppender
#日志文件的名称
log4j.appender.R.File=log4j.log
#日志文件的大小
log4j.appender.R.MaxFileSize=100KB
# 保存一个备份文件
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.TTCCLayout
#log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n
配置根Logger,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ...
level 是日志记录的优先级
appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
配置日志信息输出目的地Appender,其语法为
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
...
log4j.appender.appenderName.option = 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.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
....
log4j.appender.appenderName.layout.option = valueN
Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)