1

简单介绍概念原理及配置,主要搬运至网络其他资料,备忘。

一、主要概念

Log4j包含3个主要部件,记录器(Loggers)、输出源(Appenders)和布局器(Layouts)。这3个组件一起工作可以让开发者根据消息的类别和等级来输出消息,并控制运行时这些消息的输出样式和在哪里输出这些消息。

1. 记录器

Loggers按层次命名,假如一个Loggers后面跟着标示子记录器前缀的“.”号,那么它被看作是另一个Loggers的父祖Loggers。
根Loggers一直存在,并位于Loggers的顶端。与其他Loggers不同,它有例外特性:

  1. 它总是存在;

  2. 它不可以通过名称获得;

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配置


团结
128 声望8 粉丝

诗酒趁年华


引用和评论

0 条评论