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);
处理过程
打开日志debug
在tomcat启动参数增加-Dlog4j.debug启动tomcat,查看log4j的启动日志
通过日志发现,上述两个appender的初始化顺序是MY_APPENDER在前,LOG_APPENDER在后,由于com.exampleA.MyAppender依赖com.example.common.Hello,所以com.exampleA.MyAppender初始化,必然类Hello要初始化,此时类Hello要报错,因为它使用的appender是LOG_APPENDER,其尚未初始化,因此报出以上WARN。- 解决办法,将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>