Log4j追加至已关闭Appender问题:多作业共享控制台Appender配置咨询
解决方案:共享单个控制台Appender避免连带关闭
1. 定义全局共享的控制台Appender
在log4j配置文件中单独配置一个全局控制台Appender,所有作业Logger统一引用它,不再为每个作业单独创建控制台Appender:
# 全局共享控制台Appender(所有作业共用) log4j.appender.GLOBAL_CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.GLOBAL_CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.GLOBAL_CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n # 作业专属的文件Appender(保留原有配置) log4j.appender.internal=org.apache.log4j.DailyRollingFileAppender log4j.appender.internal.DatePattern='.'yyyy-MM-dd log4j.appender.internal.File=log/internal/internal.log log4j.appender.internal.layout=org.apache.log4j.PatternLayout log4j.appender.internal.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %C{1}:%L - %m%n # 修改作业Logger配置,引用全局控制台Appender log4j.category.internal=INFO, GLOBAL_CONSOLE, internal log4j.additivity.internal=false
2. 代码层面精准关闭作业专属Appender
Quartz作业结束时,仅关闭自身专属的DailyRollingFileAppender,跳过共享的控制台Appender,避免连带关闭:
// 获取作业对应的Logger Logger jobLogger = Logger.getLogger("internal"); // 遍历所有关联Appender Enumeration<Appender> appenders = jobLogger.getAllAppenders(); while (appenders.hasMoreElements()) { Appender appender = appenders.nextElement(); // 仅关闭作业专属的文件Appender if (appender instanceof DailyRollingFileAppender && "internal".equals(appender.getName())) { appender.close(); jobLogger.removeAppender(appender); } // 跳过全局控制台Appender,保持其开启状态 }
3. 核心原理
Log4j 1.x中Logger关闭时会默认关闭所有关联的Appender,这是你遇到报错的根本原因。通过以下两点解决:
- 全局单一控制台Appender替代作业独立控制台Appender,消除重复关联
- 作业结束时精准关闭自身专属Appender,保留共享控制台Appender的开启状态,确保其他作业可正常使用
内容的提问来源于stack exchange,提问作者DOlson
相关产品推荐
相关产品推荐

