log4j2的认知

目的

最近听说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参数
基础/时间&大小回滚/定期删除/日志脱敏

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,437评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,559评论 19 139
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,500评论 1 13
  • Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4...
    李2牛阅读 9,525评论 0 16
  • 作为Java开发人员,对于日志记录框架一定非常熟悉。而且几乎在所有应用里面,一定会用到各种各样的日志框架用来记录程...
    意识流丶阅读 14,796评论 0 13