简单介绍概念原理及配置,主要搬运至网络其他资料,备忘。
一、主要概念
Log4j包含3个主要部件,记录器(Loggers)、输出源(Appenders)和布局器(Layouts)。这3个组件一起工作可以让开发者根据消息的类别和等级来输出消息,并控制运行时这些消息的输出样式和在哪里输出这些消息。
1. 记录器
Loggers按层次命名,假如一个Loggers后面跟着标示子记录器前缀的“.”号,那么它被看作是另一个Loggers的父祖Loggers。
根Loggers一直存在,并位于Loggers的顶端。与其他Loggers不同,它有例外特性:
它总是存在;
它不可以通过名称获得;
Loggers可以设置级别,可能的级别包括:DEBUG、INFO、WARN、ERROR等等。假如一个Loggers没有设置级别,那么它的级别等于最近一个带有指定级别的父祖Loggers的级别。级别继承的正式表达是:继承的级别被指定给Loggers C,在Loggers层次中,它是和第一个非空级别相等的。为了确保所有的Loggers最终可以继承一个级别,根Loggers总是被设置一个级别。
我们通常通过调用一个Loggers的打印方法来处理日志请求;通过定义,打印方法决定一个日志请求的级别;若日志请求的级别大于等于Loggers的日志级别,那么这个日志请求会被记录。下面是基本的选择规则:在一个具有q级别的loggers(包括指定和继承)中有一个p级别的日志请求,若p>=q这个日志请求是可以输出的;
2. 输出源和布局器
基于Loggers有选择的让日志请求生效仅仅是Log4j能力的一部分,Log4j允许用户将日志输出到多个目的地。在Log4j的声明中,输出目的地被称为appender。现在,输出源包含控制台、文件、Gui组件、远程套接字服务、JMS、NT事件记录器和远程unix syslog守护进程。它也可以异步的记录日志。
一个Loggers可以有多个Appender。
AddAppender方法添加一个Appender到指定的Loggers。这个Loggers会把有效的日志请求输出到所有的输出源Appenders,Appenders被Loggers附加继承了其层次结构。
输出源Appender的附加特性:
Loggers C的日志语句输出将定向到C和它所有父祖的Appenders,这是appender additivity的附加特性。然而,假如有一个C的父祖P,其附加标识被设置为false,然后C的日志输出将定向到C及其直到父祖P的Appenders,但不包括P的父祖中的任何Appender。Loggers有其附加特性,默认true。
时常,用户不仅仅希望自定义日志输出目的地,也同样希望设置日志的输出样式。这可以通过给Appender添加Layout实现。
例如,带有"%r [%t] %-5p %c - %m%n"转换格式的PatternLayout布局器将输出和下面的内容类似。
176 [main] INFO org.foo.Bar - Located nearest gas station.
第一个字段是自从程序开始到目前花费的时间。第二个字段是发出日志请求的线程。第三个字段是日志语句的级别。第四个是和该日志请求关联的日志记录器的名称。紧接着“-”符号后面的内容是日志语句的消息。
3. Log4j.xml 配置
xml更灵活且有一些properties文件没有的功能,如根据日志的级别输出到不同的文件中。
3.1 Log4j xml配置入门
3.1.1 示例1
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
这将输出高于或等于debug级别的信息到console,注意:
首先定义一个Appender,并设置一个name(本例中名为console)。为Appender设置layout(本例中为PatternLayout),为layout设置pattern。layout的必备条件是由具体的layout决定的,所以需要检查你选择的layout的javadoc(PatternLayout是最常用的)。
在这个示例中并没有定义logger,但配置了root logger。所有的loggers都继承自root logger,所以在本例中,高于、等于debug的消息会输出到console。
3.1.2 xml配置格式
为了更好的理解更多示例,了解xml配置格式是非常有用的。它是由jar中org.apache.log4j.xml包下的log4j.dtd定义的。这里并没有列举文件中的所有内容,你需要自助查看。如果你不熟悉xml dtd格式,最好找本相关书籍学习。
接近文件的开始,如下:
<!ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?, categoryFactory?)>
这个节点定义了xml配置文件的预期构造:0或更多renderer、0或更多appender、0或更多logger、0或1个root,0或1个categoryFactory。如果文件不满足条件,将会在文件读入的时候报xml解析错误。注意,category等价与logger。
接下来,log4j.dtd定义了xml文件允许的属性。
<!ATTLIST log4j:configuration
xmlns:log4j CDATA #FIXED "http://jakarta.apache.org/log4j/"
threshold (all|debug|info|warn|error|fatal|off|null) "null"
debug (true|false|null) "null"
>
dubug 可能是最重要的属性,设置为true,它将输出xml的配置信息并配置log4j环境。它在解决配置文件不像预期的工作特别重要。
threshold 阀值,待描述。
Appender配置
定义输出debug跟踪信息的位置,如果log4j没有定义最少一个Appender,这将是无意义的。有用的信息不会显示到任何地方。
让我们重新来看log4j.dtd,appender描述如下:
<!ELEMENT appender (errorHandler?, param*, layout?, filter*, appender-ref*)>
<!ATTLIST appender
name ID #REQUIRED
class CDATA #REQUIRED
>
appender必须包含name、class属性。name用来在配置文件中引用Appender。class必须是Appender类的全限定名(如org.apache.log4j.ConsoleAppender)。
Appender包含下列子节点:
0或1个errorHandler
0或更多param
0或1个layout
0或更多filter
0或更多appender-ref
所以,根据上文,基本的console示例如下:
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>
当前,已有以下appender class:
org.apache.log4j.ConsoleAppender ConsoleAppender
org.apache.log4j.FileAppender FileAppender
org.apache.log4j.jdbc.JDBCAppender JDBCAppender
org.apache.log4j.AsyncAppender AsyncAppender
org.apache.log4j.net.JMSAppender JMSAppender
org.apache.log4j.lf5.LF5Appender LF5Appender
org.apache.log4j.nt.NTEventLogAppender NTEventLogAppender
org.apache.log4j.varia.NullAppender NullAppender
org.apache.log4j.net.SMTPAppender SMTPAppender
org.apache.log4j.net.SocketAppender SocketAppender
org.apache.log4j.net.SocketHubAppender SocketHubAppender
org.apache.log4j.net.SyslogAppender SyslogAppender
org.apache.log4j.net.TelnetAppender TelnetAppender
org.apache.log4j.WriterAppender WriterAppender
3.1.3 Logger配置
现在,Appender配置完成了。但是,怎么配置loggers,使其在某些级别输出跟踪信息?怎么配置logger输出到特定的Appender?欢迎来到Logger配置。
你需要配置的最重要的就是root Logger了,下面是一个已完成的root配置:
<root>
<priority value ="debug" />
<appender-ref ref="console" />
</root>
这个root logger配置输出debug以上的信息到console appender。所有loggers的信息都会输出到console appender。这可能很方便调试,但最终还是需要更多特定的logger。
让我们再看下log4j.dtd,logger描述如下:
<!ELEMENT logger (level?,appender-ref*)>
<!ATTLIST logger
name ID #REQUIRED
additivity (true|false) "true"
>
一个logger必须包含一个name属性。这个名字被用来创建logger实例(一般是类的全限定名)。它也可以包含一个可选的additivity属性。
logger可以包含子节点:
0或一个level
0或多个appender-ref
示例如下:
<logger name="com.mycompany.apackage.MyClass">
<level value="info"/>
</logger>
3.1.4 logger继承
待补充
3.1.5 Additivity附加
logger c的一个log语句会输出到c和它所有父祖appender。这也是术语appender additivity的意义所在。
但是,如果logger c的一个父祖为p,p的additivity属性为false,那么c的输出为c直到p,却不包含任何p的父祖。
loggers 的additivity默认为true。
配置示例:
<logger name="com.eatmutton.muttonsite.torque" additivity="false">
<level value="info" />
<appender-ref ref="local-torque" />
</logger>
更多log4j配置,请参考log4jxml配置
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。