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
相关产品推荐
相关产品推荐

