无法使用SLF4J禁用quartz-scheduler日志记录

时间:2014-11-17 02:37:55

标签: java maven logging quartz-scheduler slf4j

将quartz-scheduler添加到项目后,Tomcat的服务器日志被发送垃圾邮件,并显示以下消息:

  

[INFO] [talledLocalContainer] 12:15:06.319   [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG   o.quartz.core.QuartzSchedulerThread - 批量获取0触发器

我试图禁用该日志消息,该消息每25秒左右重复一次。我已经对同一个问题做了很多其他回答,例如:

......并且没有一种方法可行。

我在pom.xml声明了以下依赖项:

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>

我已将以下log4j.properties设置添加到我的项目中:

log4j.rootLogger=OFF
log4j.logger.quartz=OFF
log4j.logger.o.quartz=OFF
log4j.logger.org.quartz=OFF

...以及以下simplelogger.properties

org.slf4j.simpleLogger.defaultLogLevel=error

除了尝试在其中一个链接的答案上建议的程序化解决方案之外,这应该禁用所有日志记录并大致如下:

List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for ( Logger logger : loggers ) {
    logger.setLevel(Level.OFF);
}

这似乎在运行时禁用除了石英的日志消息之外的所有内容。

有没有办法摆脱石英的日志消息,除了修改石英源代码以删除它?

1 个答案:

答案 0 :(得分:3)

上面的日志条目看起来不像Log4J。我认为那是ACL或JUL。当您使用Slf4j到Log4J时,您还需要redirect these frameworks to Slf4j。将这些依赖项添加到项目中:

<!--Redirect Apache Commons Logging to Slf4J -->
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>jcl-over-slf4j</artifactId>
 <version>1.7.5</version>
</dependency>
<!--Redirect Java Util Logging to Slf4J -->
<dependency>
 <groupId>org.slf4j</groupId>
 <artifactId>jul-to-slf4j</artifactId>
 <version>1.7.5</version>
</dependency>

关于将Jul重定向到Slf4J,请阅读this doc page。请务必通过Maven从项目中排除任何现有的commons-logging.jar文件。

enter image description here

(来自Slf4J documentation page

如果所有其他方法都失败了,请尝试以下代码:

//see if we can find the offending logger through slf4j's LoggerFactory
org.slf4j.Logger logger = 
    LoggerFactory.getLogger(Class.forName("org.quartz.core.QuartzSchedulerThread"));
if (logger != null && logger instanceof ch.qos.logback.classic.Logger) {
    //the slf4j Logger interface doesn't expose any configuration API's, but 
    //we can cast to a class that does; so cast it and disable the logger
    ((ch.qos.logback.classic.Logger)logger).setLevel(
        ch.qos.logback.classic.Level.OFF);
}
相关问题