Java 日志记录器日志记录两次

Java 日志记录器日志记录两次,java,slf4j,logback,Java,Slf4j,Logback,我想在我的应用程序中使用slf4j+logback有两个目的——日志和审计 对于日志记录,我使用常规方式记录: static final Logger logger = LoggerFactory.getLogger(Main.class); logger.debug("-> main()"); 为了进行审计,我创建了一个特殊的命名记录器并记录到其中: static final Logger logger = LoggerFactory.getLogger("

我想在我的应用程序中使用slf4j+logback有两个目的——日志和审计

对于日志记录,我使用常规方式记录:

static final Logger logger = LoggerFactory.getLogger(Main.class);
logger.debug("-> main()");
为了进行审计,我创建了一个特殊的命名记录器并记录到其中:

static final Logger logger = LoggerFactory.getLogger("AUDIT_LOGGER");
Object[] params =
    { new Integer(1) /* TenantID */, new Integer(10) /* UserID */, msg};
logger.info("{}|{}|{}", params);
回写配置:

<logger name="AUDIT_LOGGER" level="info">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS}|%msg%n
            </pattern>
        </encoder>
    </appender>
</logger>

<root level="all">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
</root>

%d{HH:mm:ss.SSS}|%msg%n
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
问题: 通过audit logger记录的消息显示两次-一次在audit_logger下,一次在root logger下

14:41:57.975[main]DEBUG com.gammay.example.main-->main()

14:41:57.978 | 1 | 10 |欢迎来到梅因

14:41:57.978[main]信息审计记录程序-1 | 10 |欢迎来到main


如何确保审核消息仅在审核日志下显示一次?

更改审核日志定义,如下所示。注意记录器定义中的
additivity=“false”
标志

<logger name="AUDIT_LOGGER" level="info" additivity="false">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS}|%msg%n
            </pattern>
        </encoder>
    </appender>
</logger>

%d{HH:mm:ss.SSS}|%msg%n

这将避免在根记录器中再次记录此日志。有关更多信息,请阅读logback配置文档。

我遇到了相同的问题,但我认为正确的解决方案不同于此处通过添加性提出的解决方案。所附图表试图直观显示两种不会导致重复日志的方法:

  • 对于每个
    ,您还可以添加一个

    解决方案:

  • additivity=“false”
    添加到
    “审核日志记录程序”
    ,如上面的一个答案所述,以不从
    根日志记录程序继承附加程序

  • “审核日志程序”
    中删除
    追加器
    元素。这将导致
    “AUDIT\u LOGGER”
    记录器继承附加器

  • 小心包含其他配置文件,这也可能导致重复日志记录。在我的例子中,我必须删除
    base.xml
    include块,它定义了根记录器和附加器


  • 关闭审计记录器上的可加性。@RaviH抱歉,您能解释一下吗?您的意思是删除审核记录器的appender吗?
    <include resource="org/springframework/boot/logging/logback/base.xml">
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>%d{HH:mm:ss.SSS}|%msg%n</pattern>
      </encoder>
    </appender>
    
    <logger name="AUDIT_LOGGER" level="info" additivity="false">
      <appender-ref ref="STDOUT" />
    </logger>