• Java日志系统之Log4j2


    Log4j2介绍

    Log4j2是Log4j的升级版,参考Logback的优秀设计并修复了一些问题。主要优点有:

    • 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
    • 性能提升,log4j2相较于log4j和logback都具有很明显的性能提升。
    • 自动重载配置,参考了logback的设计,会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
    • 无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvmgc。

    Log4j2的简单使用

    Log4j2和Slf4j一样,既可以当门户也可以当日志实现。但是通常都是用Slf4j当门户,Log4j2当日志实现。先单独使用Log4j2进行日志打印

    1. org.apache.logging.log4j
    2. log4j-api
    3. 2.19.0
    4. org.apache.logging.log4j
    5. log4j-core
    6. 2.19.0
    7. junit
    8. junit
    9. 4.12
    1. public class TestLog4j2 {
    2. public final static Logger logger = LogManager.getLogger(TestLog4j2.class);
    3. @Test
    4. public void testLog() throws Exception {
    5. logger.fatal("fatal");
    6. logger.error("error");
    7. logger.warn("wring");
    8. logger.info("info");
    9. logger.debug("debug");
    10. logger.trace("trace");
    11. }
    12. }

    20:05:28.830 [main] FATAL com.zmt.TestLog4j2 - fatal

    20:05:28.831 [main] ERROR com.zmt.TestLog4j2 - error

    可以看出,Log4j2的默认级别为error。

    接下来使用Slf4j与Log4j2混合使用。

    只需要在pom文件中添加slf4j-api与log4j-slf4j-impl依赖就好。其余什么都不用改变。

    1. org.slf4j
    2. slf4j-api
    3. 2.0.7
    4. org.apache.logging.log4j
    5. log4j-slf4j-impl
    6. 2.13.3
    7. junit
    8. junit
    9. 4.12

    Log4j2的配置文件

    log4j2默认加载classpath路径下的log4j2.xml文件

    1. "1.0" encoding="UTF-8"?>
    2. "warn" monitorInterval="5">
    3. "log_dir" value="D:/logs">
    4. "Console" target="SYSTEM_ERR">
    5. "%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
    6. "file" fileName="${log_dir}/myfile.log">
    7. "[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/>
    8. "accessFile" fileName="${log_dir}/myAcclog.log">
    9. "[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/>
    10. "rollingFile" fileName="${log_dir}/myrollog.log"
    11. filePattern="${log_dir}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
    12. "debug" onMatch="ACCEPT" onMismatch="DENY"/>
    13. "[%d{yyyy-MM-dd HH:mm:ss}] [-5level] %l %c{36} - %msg%n"/>
    14. "10 MB"/>
    15. "30"/>
    16. "trace">
    17. "Console"/>
    18. "file"/>

    Log4j2异步日志

    异步日志分为三种:

    • AsyncAppender:异步Appender
    • 全局AsyncLogger:全局异步Logger
    • 混合AsyncLogger:异步与同步混合使用的Logger

    其中异步Appender的性能最差,基本不使用。

    全局异步Logger性能最好,但是有时并不是所有的业务都需要异步记录日志,因此也不常用。

    通常使用混合AsyncLogger。

    异步Appender简单实现

    在xml配置文件中Appenders标签下添加配置

    1. "Console" target="SYSTEM_ERR">
    2. "%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
    3. "file" fileName="${log_dir}/myfile.log">
    4. "[%d{yyyy-MM-dd HH:mm:ss}] [%-5level] %l %c{36} - %m%n"/>
    5. "async">
    6. "file">
    7. "trace">
    8. "Console"/>
    9. "async"/>
    1. public class TestLog4j2 {
    2. public final static Logger logger = LogManager.getLogger(TestLog4j2.class);
    3. @Test
    4. public void testLog() throws Exception {
    5. logger.fatal("fatal");
    6. logger.error("error");
    7. logger.warn("wring");
    8. logger.info("info");
    9. logger.debug("debug");
    10. logger.trace("trace");
    11. }
    12. }

    观察日志文件

    全局异步Logger简单实现

    只需要在resource目录下创建文件名为log4j.component.properties添加如下配置

    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

    log4j2.xml配置文件不需要做任何改动。

    混和异步Logger简单实现

    如果使用混合异步Logger,需要将全局异步Logger的配置文件注释或删除,并且需要添加依赖。

    1. com.lmax
    2. disruptor
    3. 3.4.4

    在log4j.xml文件中进行修改

    1. "com.zmt" level="debug" includeLocation="false" additivity="false">
    2. "Console"/>
    3. "trace">
    4. "Console"/>
    5. "async"/>

    观察控制台输出

    可以看到,即使日志格式中添加了%L但仍不会再控制台中打印行号

    注意:

    • 如果使用异步日志AysncAppender、AsyncLogger与全局日志不要同时出现,性能会和最差的一致
    • 设置includeLocation为false是必要的,打印位置信息会降低异步日志的性能,比同步日志还慢。

    Log4j2的无垃圾模式

    其他日志系统在记录日志时会分配临时对象,如日志事件对象、字符串、字符数组等,当临时对象过多时会触发JVM的gc操作(该操作会暂停程序的运行)。而Log4j2从2.6版本开始,默认情况下以无垃圾模式运行,主要原理是重用对象和缓冲区,尽可能的不分配临时对象。

  • 相关阅读:
    27、Flink 的SQL之SELECT (窗口聚合)介绍及详细示例(4)
    外部H5页面打开微信小程序最新流程
    Python学习笔记——逻辑判断和循环
    可编程 USB 转串口适配器开发板的详细接口与功能
    【蜂鸟E203的FPGA验证】Chap.6 基于Iverilog的指令功能与流水线仿真
    如何优雅的实现无侵入性参数校验之spring-boot-starter-validation
    供应试剂mPEG-Methacrylate,mPEG-MAC,CAS:26915-72-0
    JZ18 删除链表的节点
    青春无言│用技术定格毕业季最美好的回忆
    Vue 2 nextTick方法|异步更新|事件循环
  • 原文地址:https://blog.csdn.net/zmbwcx/article/details/133975012