美文网首页
log4j2的认知

log4j2的认知

作者: hangjun | 来源:发表于2018-10-17 13:19 被阅读0次

目的

最近听说log4j2的性能很不错,所以来学习学习,最终集成到springboot中。花了一周的时间,对log4j2有了一定的理解。这边文章不是讲如何学习和配置log4j2,主要还是记录一些基础的认知。

学习log4j2(不是重点)

如果你要学习log4j2,那我推荐你看这些资料。
请点击以下的文章(自己看)
文章1
文章2
文章3
文章4

工作原理(重点)

这个其实是重点!其他一些配置,查查文档就可以了。
请起码能看懂这个log4j2.xml文件哈

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M  - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <!--过滤掉spring和hibernate的一些无用的debug信息-->
    <logger name="org.springframework" level="INFO"></logger>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
    
    <logger name="org.mybatis" level="INFO"  additivity="false"></logger>
  </Loggers>
</Configuration>

问题1:日志是怎样输出的?
思考: 如果让你去设计一个日志框架,满足这样的需求:针对特定的类,做一些配置,就能打印设置的级别;对于其他的类,设置默认的打印级别。
log4j2是这样设计的,对于没有任何配置的类,我都用 Root 设置的级别 <Root level="debug">。而对于特定的类,例如这个类org.springframework.A.java 我这样配置<logger name="org.springframework" level="info"></logger>

注意理解root和logger的关系?
root和logger是父子节点!!!root是父节点,logger是子节点!!!
对于com.hr.A.java这个类。没有找到任何有关的配置,会找到root的级别是debug,那么这个com.hr.A.java中输出debug级别以上的日志,日志输出到名字是Console的append中。
对于org.springframework.A.java这个类。只会找到名字为org.springframework的logger且级别是info,因为这个logger子节点没有输出到任何appender,所以在logger子节点是不会输出任何东西。但是logger子节点的日志会传递给父节点root,注意此时日志的级别还是info,不是debug.因为root节点输出到console的append中,所以会打印到控制台中。
其实就是一句话:如果没有配置,那么就会使用root的级别;如果有配置,就会使用配置的级别。
但是要注意输出的地方:子节点可以输出,父节点也可以输出。例如下面的配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M  - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <!--过滤掉spring和hibernate的一些无用的debug信息-->
    <logger name="org.springframework" level="INFO">
      <AppenderRef ref="Console"/> 
   </logger>
    <Root level="debug">
      <AppenderRef ref="Console"/>
    </Root>
    
    <logger name="org.mybatis" level="INFO"  additivity="false"></logger>
  </Loggers>
</Configuration>

这段配置,对于org.springframework.A.java这个类的日志,子节点logger先输出到名为Console的appender中;接着日志传递到root节点,root也会输出到名为Console的appender中.所以会打印两边。那么如果不想打印两遍,第一种做法在子节点中不打印,即不用配置appender。第二种使用additivity="false",这个就代表,不传递给父节点,日志不传给父节点,就算父节点配置了appender也是不会输出日志的!

高阶用法(扩展内容)

尝试看看官方文档即可,我这边列举简单的用法。
请点击以下的文章(自己看)
自定义pattern参数
基础/时间&大小回滚/定期删除/日志脱敏

相关文章

网友评论

      本文标题:log4j2的认知

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