博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Log4J使用入门
阅读量:6334 次
发布时间:2019-06-22

本文共 4098 字,大约阅读时间需要 13 分钟。

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

一、主要概念

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

这将输出高于或等于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格式,最好找本相关书籍学习。

接近文件的开始,如下:

这个节点定义了xml配置文件的预期构造:0或更多renderer、0或更多appender、0或更多logger、0或1个root,0或1个categoryFactory。如果文件不满足条件,将会在文件读入的时候报xml解析错误。注意,category等价与logger。

接下来,log4j.dtd定义了xml文件允许的属性。

  • dubug 可能是最重要的属性,设置为true,它将输出xml的配置信息并配置log4j环境。它在解决配置文件不像预期的工作特别重要。

  • threshold 阀值,待描述。

Appender配置

定义输出debug跟踪信息的位置,如果log4j没有定义最少一个Appender,这将是无意义的。有用的信息不会显示到任何地方。

让我们重新来看log4j.dtd,appender描述如下:

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 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 logger配置输出debug以上的信息到console appender。所有loggers的信息都会输出到console appender。这可能很方便调试,但最终还是需要更多特定的logger。

让我们再看下log4j.dtd,logger描述如下:

一个logger必须包含一个name属性。这个名字被用来创建logger实例(一般是类的全限定名)。它也可以包含一个可选的additivity属性。

logger可以包含子节点:

  • 0或一个level

  • 0或多个appender-ref

    示例如下:

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。
配置示例:

更多log4j配置,请参考

转载地址:http://kzsoa.baihongyu.com/

你可能感兴趣的文章
windows 注册表讲解
查看>>
【算法】论平衡二叉树(AVL)的正确种植方法
查看>>
基于DDD的现代ASP.NET开发框架--ABP系列之1、ABP总体介绍
查看>>
react 从零开始搭建开发环境
查看>>
scala recursive value x$5 needs type
查看>>
ps -ef |grep 输出的具体含义
查看>>
markdown编辑
查看>>
ASCII 在线转换器
查看>>
Linux内核同步:RCU
查看>>
Android逆向进阶——让你自由自在脱壳的热身运动(dex篇)
查看>>
Java设计模式之五大创建型模式(附实例和详解)
查看>>
60 Permutation Sequence
查看>>
主流的RPC框架有哪些
查看>>
Hive学习之路 (七)Hive的DDL操作
查看>>
[转]mysql使用关键字作为列名的处理方式
查看>>
awesome go library 库,推荐使用的golang库
查看>>
树形展示形式的论坛
查看>>
jdbcTemplate 调用存储过程。 入参 array 返回 cursor
查看>>
C++中的stack类、QT中的QStack类
查看>>
Linux常用基本命令[cp]
查看>>