Log4j报错咨询:category标签解析及同一appender复用可行性
解答你的Log4j配置疑问
先聊聊你遇到的报错:
2018-03-23 17:34:38,857 ERROR [stderr] (default task-8) log4j:ERROR Attempted to append to closed appender named [eproc-file-out]
先别急,咱们先把你问的两个核心问题解决掉:
1. 说说Log4j.xml里的<category>标签到底是干嘛的
<category>其实就是Log4j给咱们提供的日志精细化控制工具,简单说就是给不同包/类的日志单独定规矩:
name属性:指定要管控的Java包或者具体类的全路径(比如你配置里的com.presentation、org.apache),只要是这个路径下的类打日志,就会遵守这个category的规则。<priority>:设置这个category的日志级别,比如DEBUG、ERROR,只有级别不低于这个值的日志才会被处理。<appender-ref>:指定这个category的日志要输出到哪个预先定义好的appender(比如你的eproc-file-out文件输出器)。
举个例子,你给com.metaparadigm这个category设成ERROR级别,意思就是这个包下的类只有ERROR及以上级别的日志才会写到eproc-file-out里,DEBUG、INFO级别的直接过滤掉,非常灵活。
2. 所有<category>能不能都用同一个<appender-ref ref="eproc-file-out"/>?
当然可以!而且这是非常常规的操作,你自己的配置其实已经这么做了😂
这么配置的好处很多:
- 不用重复写一堆一样的appender配置,减少冗余
- 后续要改日志存储路径、输出格式或者滚动策略,只需要改
eproc-file-out这一处就行,省心 - 所有分类的日志都统一写到同一个文件里,方便后期排查问题时统一检索
至于你遇到的Attempted to append to closed appender报错,和多个category共用同一个appender没关系,大概率是这几个原因:
- 代码里不小心手动调用了appender的关闭方法
- JBoss容器重启或者类加载器回收时,appender的资源没释放干净,导致后续日志想写入的时候,文件句柄已经被关了
- 日志文件的权限有问题,比如系统把文件锁了,导致appender被迫关闭
最后给你把配置格式化了一下,看起来更清晰:
<appender name="eproc-file-out" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${jboss.server.log.dir}/eProcurement/eProcurementServerLog.log"/> <param name="Append" value="true"/> <param name="DatePattern" value="'.'dd'.txt'"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> </layout> </appender> <category name="com.presentation"> <priority value="DEBUG"/> <appender-ref ref="eproc-file-out"/> </category> <category name="com.service"> <priority value="DEBUG"/> <appender-ref ref="eproc-file-out"/> </category> <category name="com.dao"> <priority value="DEBUG"/> <appender-ref ref="eproc-file-out"/> </category> <category name="org.apache"> <priority value="DEBUG"/> <appender-ref ref="eproc-file-out"/> </category> <category name="org.springframework"> <priority value="DEBUG"/> <appender-ref ref="eproc-file-out"/> </category> <category name="com.metaparadigm"> <priority value="ERROR"/> <appender-ref ref="eproc-file-out"/> </category> <root level="debug"> <appender-ref ref="eproc-file-out"/> <!-- 补全了你配置里的截断部分 --> </root>
内容的提问来源于stack exchange,提问作者Nishat Lakhani
相关产品推荐
相关产品推荐

