Log4j2-24-log4j2 相同的日志打印 2 次

现象

相同的日志打印了两次,且因为日志的配置不同,导致脱敏的情况不一致。

代码与配置

代码

package com.ryo.log4j2.cfg.additivity;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class SimpleDemo {
   

  private static final Logger logger = LogManager.getLogger(SimpleDemo.class.getName());

  public static void main(String[] args) {
   
    logger.info("do it");
  }

}

log4j2.xml 配置文件

简化如下

<?xml version="1.0" encoding="UTF-8"?>
<!--monitorInterval属性指定的配置元素和设置为非零值那么下次将要检查文件日志事件评估和/或记录和monitorInterval运行自上次检查。
下面的例子展示了如何配置配置文件属性,以便将检查变化只有在至少60秒后运行。最小间隔5秒。-->
<Configuration status="WARN" monitorInterval="60">

    <properties>
        <property name="LOG_HOME">${sys:user.home}/logs/log4j2/log4j2/</property>
    </properties>

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


    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

这里没有额外的 appender,就算有,所有的匹配的 additivity="false",应该也不会重复才对。

问题分析

发现项目配置比较奇怪,在启动的时候 jvm 指定了配置。

-Dlog4j.configurationFile=otherLog4j2.xml,log4j2.xml

相当于指定了两个配置文件。

otherLog4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--monitorInterval属性指定的配置元素和设置为非零值那么下次将要检查文件日志事件评估和/或记录和monitorInterval运行自上次检查。
下面的例子展示了如何配置配置文件属性,以便将检查变化只有在至少60秒后运行。最小间隔5秒。-->
<Configuration status="WARN" monitorInterval="60">

    <properties>
        <property name="LOG_HOME">${sys:user.home}/logs/log4j2/log4j2/</property>
    </properties>

    <Appenders>
        <Console name="COMMON-Console" target="SYSTEM_OUT">
            <PatternLayout pattern="OTHER %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>

        <File name="FileAll" fileName="all.log" bufferedIO="false" advertise="true">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
    </Appenders>


    <Loggers>
        <Root level="DEBUG">
            <AppenderRef ref="COMMON-Console"/>
        </Root>
    </Loggers>
</Configuration>

日志效果

2 个都会打印。

2023-07-20 14:07:46,005 main WARN The bufferSize is set to 8192 but bufferedIo is false: false

OTHER 14:07:46.057 [main] INFO  com.ryo.log4j2.cfg.additivity.SimpleDemo - do it
CURRENT 14:07:46.057 [main] INFO  com.ryo.log4j2.cfg.additivity.SimpleDemo - do it

解决方式

直接把 jvm 启动时只保留一个 log4j2.xml 文件即可。

如果确实需要另外一个配置文件,可以考虑在 log4j2.xml 针对 logger 进行拦截重写日志隔离级别,避免重复打印。

精准匹配之后,就不会再往兜底执行了。两个都是兜底,就会执行多次。

参考资料

https://blog.csdn.net/blue_driver/article/details/125007794

在这里插入图片描述

相关推荐

  1. springboot日志配置文件log4j2.xml

    2024-02-01 12:56:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-01 12:56:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-01 12:56:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-01 12:56:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-01 12:56:01       18 阅读

热门阅读

  1. [python] 使用sqlparse 解析和美化SQL

    2024-02-01 12:56:01       23 阅读
  2. Linux 分卷压缩命令

    2024-02-01 12:56:01       37 阅读
  3. MongoDB 中的事务

    2024-02-01 12:56:01       35 阅读
  4. CF1918 D. Blocking Elements [二分+数据结构优化dp]

    2024-02-01 12:56:01       32 阅读
  5. 网课:机器翻译——牛客(题解)

    2024-02-01 12:56:01       37 阅读
  6. 11.Ubuntu

    11.Ubuntu

    2024-02-01 12:56:01      23 阅读
  7. ubuntu22.04 安装conda

    2024-02-01 12:56:01       38 阅读
  8. ubuntu 22.04 安装ffplay

    2024-02-01 12:56:01       31 阅读
  9. render函数的基本实现

    2024-02-01 12:56:01       35 阅读
  10. SpringBoot 集成 ClickHouse

    2024-02-01 12:56:01       27 阅读