log4j2分析总结

Posted 养码青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2分析总结相关的知识,希望对你有一定的参考价值。

现在公司用log4j2 进行日志记录,我也看了相关的资料,现在进行记录学习总结下

整体结构

  • Appenders里设置日志的输出方式、级别和格式

  • Loggers里设置全局的级别和绑定appenders里的name

简单代码demo

加载依赖

登录官网,找到maven依赖

 
   
   
 
  1. <dependencies>

  2.  <dependency>

  3.    <groupId>org.apache.logging.log4j</groupId>

  4.    <artifactId>log4j-api</artifactId>

  5.    <version>2.11.0</version>

  6.  </dependency>

  7.  <dependency>

  8.    <groupId>org.apache.logging.log4j</groupId>

  9.    <artifactId>log4j-core</artifactId>

  10.    <version>2.11.0</version>

  11.  </dependency>

  12. </dependencies>

新建一个log4j2.xml

 
   
   
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <Configuration status="WARN">

  3.    <Appenders>

  4.        <Console name="Console" target="SYSTEM_OUT">

  5.            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

  6.        </Console>

  7.    </Appenders>

  8.    <Loggers>

  9.        <Root level="TRACE">

  10.            <AppenderRef ref="Console" />

  11.        </Root>

  12.    </Loggers>

  13. </Configuration>

新建一个测试类

 
   
   
 
  1.    Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

  2.    logger.trace("trance level");

  3.    logger.debug("debug level");

  4.    logger.info("info level");

  5.    logger.warn("warn level");

  6.    logger.error("error level");

  7.    logger.fatal("fatal level");

输出结果

 
   
   
 
  1. 22:36:42.966 [main] TRACE  - trance level

  2. 22:36:42.968 [main] DEBUG  - debug level

  3. 22:36:42.969 [main] INFO   - info level

  4. 22:36:42.969 [main] WARN   - warn level

  5. 22:36:42.969 [main] ERROR  - error level

  6. 22:36:42.969 [main] FATAL  - fatal level

细节分析

首先 我们要明白日志的级别

日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出

Configuration

  • Configuration为根节点,有一个status属性,这个属性表示log4j2本身的日志信息打印级别

Appenders

建议大家去官网看看,现在支持很多种appender,并且官网上也有示例。

Console节点中的PatternLayout定义了输出日志时的格式

  • %d{HH:mm:ss.SSS} 表示输出到毫秒的时间


  • %t 输出当前线程名称


  • %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0


  • %logger 输出logger名称,因为Root Logger没有名称,所以没有输出


  • %msg 日志文本


  • %n 换行


其他的参数意义,大家遇到自行搜索

自定义Appender

我们发现这个log4j2是支持我们自定义的Appender的,很好的体现了开闭原则:对扩展支持,对修改关闭。再想想渣渣猿我自己写的代码,果然大神们写的代码还是很six的,这里不具体展开详细介绍,我现在对这一块也不是很熟悉

注意事项

大家最好结合阿里规约中日志的规约,大家自行查看。摘出其中一句话,供大家参考

大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点。记录日志时请 思考:这些日志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?


以上是关于log4j2分析总结的主要内容,如果未能解决你的问题,请参考以下文章

分析并复现Apache核弹级漏洞,利用Log4j2使目标服务器执行任意代码

log4j漏洞分析及总结

Log4j2高危漏洞CNVD-2021-95914复现及分析

Log4j2分析与实践

Apache Log4j2 RCE 远程命令执行漏洞复现与分析

log4j2过滤器篇