美文网首页JAVA-第三方
Log4j日志实例的继承与覆盖

Log4j日志实例的继承与覆盖

作者: 理查德成 | 来源:发表于2018-12-03 20:21 被阅读70次

一、日志实例

log4j核心类图

log4j核心类图

创建Logger实例:

使用log4j的日志功能时,首先需要创建一个Logger类的实例,才能使用打印日志的功能:

Logger logger = Logger.getLogger(Test.class);

Logger类中getLogger()方法的实现是:

static public Logger getLogger(Class clazz) {
    return LogManager.getLogger(clazz.getName());
}

实际上使用 LogManager.getLogger(Test.class)获取Logger实例

通过实现方式可以看到最后还是使用了Test类的全限定类名去获取Logger实例,实际上,完全可以直接传递Test类的全限定类名,这里是com.xgd.Test,来构建一个Logger实例:

Logger logger = Logger.getLogger("com.xgd.Test");

com.xgd.Test就是这个日志实例的实例名。

日志实例指定appender:

创建好了日志实例,还需要给该实例关联一个Appender(如上类图),才能将通过该实例打印的日志输出到制定Appender中。
log4jproperties配置中,可以使用log4j.logger后加上日志实例名来指定一个日志实例,并进行输出配置,如:

log4j.logger.com.xgd.Test=debug, console #console是名为console的appender

给名为com.xgd.Test的日志实例指定了输出目的地appender; 在log4j的xml配置中,可以使用以下方式配置日志实例的输出:

     <logger name="实例名"> <!--com.xgd.Test-->
          <level value=""/>
          <appender-ref ref="AppenderName" />
     </logger>

二、继承与覆盖

继承性:

log4j的配置中有一个根loggerrootLogger/root,其配置为:

log4j.rootLogger=DEBUG,consoleAppender

或者是:

<root>
    <priority value="debug" />     
    <appender-ref ref="CONSOLE" />      
</root>

隐式继承:
root配置决定了所有日志实例打印日志都必须遵守的规则——日志级别以及输出目的地,也即是说所有的日志实例继承了rootLogger/<root>的输出配置,即appender和输出级别。root配置就像java中的Object类一样,任何日志实例都默认“继承”于root,以使得所有日志实例具有root的特性。

显式继承:

日志实例名或配置logger时使用了英文句号 .作为分隔名称,那么日志实例的世界就精彩了起来,“.” 的出现使日志实例具有了显示继承性,通过使用“.”,我们可以理解为显示继承了其他日志实例,如下配置:

     log4j.logger.parent = Console, debug (实例名parent)

那么,

private static final Logger logger= Logger.getLogger("parent.child");

实例名为parent.child的日志实例,其打印出来的日志具有名为parent的日志实例的特性,日志级别为debug,输出目的地为console。子日志实例(parent.child)继承了父日志实例(parent)。

日志实例的继承有以下特性:

1)输出级别的覆盖:

如下配置:

log4j.rootLogger=DEBUG, Console
# 以下子logger实例的日志输出级别覆盖了父logger实例
log4j.logger.parent=INFO

那么:
private static final Logger logger= Logger.getLogger("parent");
名为parent的日志实例,打印出来的日志具有info级别而不是debug级别,缩减了日志的级别范围。

同样,扩大了父logger实例的日志级别的子logger实例也会造成覆盖

log4j.rootLogger=INFO, Console
#以下配置的logger,重写了日志输出级别
log4j.logger.parent=DEBUG

无论子logger实例扩大还是缩减了父logger实例的日志级别,都会造成对父logger实例日志级别的覆盖。

2)输出目的地的追加:

如下配置:

 <logger name="third">
    <level value="info" />
    <appender-ref ref="Console" />
</logger>
<root>
    <level value= "trace" />
    <appender-ref ref= "Console" />
</root>

那么继承自名为third的日志实例会输出两次的info级别以上的日志信息
不同于子logger实例对父logger实例输出日志级别的覆盖,子logger实例 的appender配置会在父logger实例的基础上追加。

就像这样:

image.png

3)放弃追加

additivity,添加的意思。
additivity属性用于屏蔽对父logger实例appender的追加,通过设置子实例loggeradditivity属性为false,使子logger屏蔽掉父loggerappender

如下配置:

<logger name="third" additivity="false" >
    <level value="info" />
    <appender-ref ref="fileappende" />
</logger>
<root>
    <level value= "trace" />
    <appender-ref ref= "Console" />
</root>

则继承自名为third的日志实例打印的日志不会输出到父日志实例中指定的appender(Console),只输出到fileappender中。

当然,若子logger实例没有指定appender,并且指定了additivityfalse,那么在打印日志时,会找不到输出目的地appender,从而产生异常。

如以下third没有指定appender,且放弃追加root实例的appender

<logger name="third" additivity="false" >
    <level value="info" />
</logger>
<root>
    <level value= "trace" />
    <appender-ref ref= "Console" />
</root>

使用继承自third的日志实例输出日志,会报错:
log4j:WARN No appenders could be found for logger (third.log.CommonsLogTest).

相关文章

  • Log4j日志实例的继承与覆盖

    一、日志实例 log4j核心类图 创建Logger实例: 使用log4j的日志功能时,首先需要创建一个Logger...

  • 公司nginx的 access.log 和 error.log

    access.log 使用配置方式: 日志实例: 日志参数: error.log log4j access.log...

  • logback-spring.xml配置简述

    什么是 Logback logback继承自log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系...

  • js面向对象总结

    1、类与实例 类的声明 实例化 2、类与继承 继承的几种方式

  • Netty源码分析-08 Netty的日志

    8.1 Java的日志系统 java领域存在多种日志框架,目前常用的日志框架包括Log4j,Log4j 2,Com...

  • 继承的实例变量不能被覆盖

    1.父类的变量(实例变量和静态变量)能被子类的同名变量隐藏 2.父类的静态方法被子类的同名静态方法隐藏 3.父类的...

  • ES的类与继承

    ES5中的类与继承 构造函数继承,原型继承,组合式继承 静态方法,静态属性,实例方法,实例属性 ES6中的类与继承...

  • logback 配置详解

    概览 简单地说,Logback 是一个 Java 领域的日志框架。它被认为是 Log4J 的继承人。Logback...

  • JS面向对象

    类与实例 创建类 实例化 类与继承 实现继承的几种方式 方式一:利用构造函数进行继承 但是这种方法缺点是无法继承父...

  • 面向对象类

    类与实例 类的声明 ES5 ES6 生成实例 类与继承 如何实现继承 继承的几种方式 原型链是实现继承的主要方法 ...

网友评论

    本文标题:Log4j日志实例的继承与覆盖

    本文链接:https://www.haomeiwen.com/subject/whyucqtx.html