Quartz Scheduler日志通过log4net写入错误文件的解决问询
解决Quartz日志写入错误log4net文件的问题
我之前也碰到过类似的log4net日志路由坑,核心原因是Quartz自身命名空间的日志没有被显式配置的logger捕获,导致继承了上层(比如root)logger的配置,从而写入了错误的文件。下面是具体的解决步骤和配置示例:
关键配置思路
log4net的logger是按命名空间前缀匹配的,并且默认会向上传递日志到父级logger(包括root)。要把所有Quartz相关日志统一路由到指定文件,需要:
- 为
Quartz根命名空间创建专属logger,覆盖所有子命名空间(如Quartz.Impl、Quartz.Core)的日志处理 - 关闭该logger的
additivity属性,阻止日志向上传递到其他logger(避免重复写入或写入错误文件) - 将该logger关联到你的
QuartzSchedulingRollingFileAppender
具体配置示例
假设你的log4net配置文件已经定义了QuartzScheduling和MyAppXYZApi两个Appender,只需添加以下logger配置:
<!-- 路由所有Quartz命名空间的日志到QuartzScheduling文件 --> <logger name="Quartz" additivity="false"> <level value="INFO" /> <!-- 根据需求调整日志级别,比如DEBUG/ERROR等 --> <appender-ref ref="QuartzScheduling" /> </logger> <!-- 业务项目MyApp.XYZApi的日志配置,确保additivity关闭 --> <logger name="MyApp.XYZApi" additivity="false"> <level value="INFO" /> <appender-ref ref="MyAppXYZApi" /> </logger> <!-- Root Logger配置:建议设置为OFF或指向通用日志文件,避免意外捕获未匹配的日志 --> <root> <level value="OFF" /> <!-- 如果需要通用日志,可以添加一个通用Appender --> <!-- <appender-ref ref="GeneralLogAppender" /> --> </root>
关键参数解释
name="Quartz":匹配所有以Quartz开头的命名空间,不管是Quartz.Impl.StdSchedulerFactory还是Quartz.Core.QuartzScheduler,都会被这个logger处理additivity="false":这是核心!它会禁止当前logger的日志传递到父级logger(包括root),这样Quartz的日志就不会被其他Appender(比如MyAppXYZApi)捕获level属性:控制该logger输出的日志级别,按需调整即可
额外检查点
- 确保两个项目都正确加载了包含上述配置的log4net文件(如果是共用一个配置文件,直接生效;如果是独立配置,每个项目的配置都要保证Quartz的logger配置正确)
- 检查项目中log4net的初始化代码,比如在
MyApp.QuartzImplementation中是否用XmlConfigurator.Configure加载了正确的配置文件
这样配置后,所有Quartz相关的日志就会统一写入QuartzScheduling指定的日志文件,不会再混入业务项目的日志里了。
内容的提问来源于stack exchange,提问作者Kamran Shahid
相关产品推荐
相关产品推荐

