记录一次log4j WARN的处理过程

在启动Tomcat时遇到log4j WARN提示,表明logger (com.example.common.Hello) 没有找到合适的appender。通过检查log4j.xml配置文件,发现初始化顺序错误,MY_APPENDER在LOG_APPENDER之前导致问题。通过调整logger的顺序,确保LOG_APPENDER先于MY_APPENDER初始化,从而解决了WARN警告。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WARN详情

tomcat启动时出现一个这样的WARN
log4j:WARN No appenders could be found for logger (com.example.common.Hello).
log4j:WARN Please initialize the log4j system properly.

log.xml部分内容如下:

<appender name="LOG_APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="file" value="${logfile.location}"/>
</appender>
<appender name="MY_APPENDER" class="com.exampleA.MyAppender">
</appender>
<logger name="com.exampleB.common.Print" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="MY_APPENDER"/>
</logger>
<root>
    <level value="INFO"/>
    <appender-ref ref="LOG_APPENDER"/>
</root>

com.example.common.Hello的部分代码为

private static final Logger LOG = LoggerFactory.getLogger(Hello.class);

处理过程

  1. 打开日志debug
    在tomcat启动参数增加-Dlog4j.debug

  2. 启动tomcat,查看log4j的启动日志
    通过日志发现,上述两个appender的初始化顺序是MY_APPENDER在前,LOG_APPENDER在后,由于com.exampleA.MyAppender依赖com.example.common.Hello,所以com.exampleA.MyAppender初始化,必然类Hello要初始化,此时类Hello要报错,因为它使用的appender是LOG_APPENDER,其尚未初始化,因此报出以上WARN。

  3. 解决办法,将LOG_APPENDER早于MY_APPENDER初始化
    appender初始化的顺序依赖于logger的初始化顺序,并且root标签是最后初始化,所以改变logger的顺序,修改log4j.xml如下即可解决上述WARN
<appender name="LOG_APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${logfile.location}"/>
</appender>
<appender name="MY_APPENDER" class="com.exampleA.MyAppender">
</appender>
<logger name="com" additivity="false">
    <appender-ref ref="LOG_APPENDER"/>
</logger>
<logger name="com.exampleB.common.Print" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="MY_APPENDER"/>
</logger>
<root>
    <level value="INFO"/>
    <appender-ref ref="LOG_APPENDER"/>
</root>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值