You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Log4j Appender日志级别超出预期,如何调整为设定级别?

解决Spring Boot中Log4j2 Appender日志级别异常的问题

你的Log4j2配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console">
            <PatternLayout pattern="%d %level %pid --- [%t] %c : %m%n"/>
        </Console>

        <JDBC name="DB" tableName="logs">
            <DriverManager connectionString="url" userName="username" password="$password"/>
            <Column name="TIM_TIMESTAM" isEventTimestamp="true"/>
            <Column name="DES_LOGGER" pattern="%c"/>
            <Column name="COD_JLEVEL" pattern="%level"/>
            <Column name="DES_LMESSAGE" pattern="%m}"/>
        </JDBC>

        <Async name="Async">
            <AppenderRef ref="DB"/>
        </Async>
    </Appenders>

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

同时application-LOCAL.yml中的日志配置:

logging:
  path:
  level:
    org:
      hibernate:
        type: trace

问题原因

你给org.hibernate.type单独设置了TRACE级别,而Log4j2的日志传递规则是:当子Logger的级别低于Root级别时,子Logger的日志会向上传递到Root Logger,最终被Root关联的所有Appender(Console和Async)输出。这就导致Appender会接收到TRACE级别的日志,看起来像是Root级别被改成了TRACE。

解决方法

方法1:隔离子Logger的日志传递

在log4j2.xml的<Loggers>节点下添加针对org.hibernate.type的Logger配置,关闭日志向上传递:

<Logger name="org.hibernate.type" level="TRACE" additivity="false">
    <!-- 只让这个Logger的日志输出到指定Appender,比如只输出到Console -->
    <AppenderRef ref="Console"/>
</Logger>

additivity="false"会阻止该Logger的日志传递到Root,这样Root的Appender(包括Async关联的DB)就不会收到它的TRACE日志,Root依然按照INFO级别输出其他日志。

方法2:给Appender添加级别过滤

如果需要让org.hibernate.type的日志也写入数据库,但只想保留INFO及以上级别,可以给JDBC Appender添加LevelFilter:

<JDBC name="DB" tableName="logs">
    <DriverManager connectionString="url" userName="username" password="$password"/>
    <!-- 添加级别过滤器,只接收INFO及以上日志 -->
    <LevelFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    <Column name="TIM_TIMESTAM" isEventTimestamp="true"/>
    <Column name="DES_LOGGER" pattern="%c"/>
    <Column name="COD_JLEVEL" pattern="%level"/>
    <Column name="DES_LMESSAGE" pattern="%m}"/>
</JDBC>

这样不管Logger的级别是什么,DB Appender只会处理INFO及以上级别的日志。

方法3:调整yml中的日志级别

如果不需要org.hibernate.type输出TRACE日志,直接修改application-LOCAL.yml:

logging:
  path:
  level:
    org:
      hibernate:
        type: info

或者直接删除这个单独的级别配置,让它继承Root的INFO级别。

内容的提问来源于stack exchange,提问作者thmasker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:43:12