我成功地使用Spring的@Scheduled注解每隔几秒钟执行一次方法。唯一的问题是,由于这种方法,我从Hibernate和Spring等获得了大量关于事务的日志消息。
我希望保持日志记录级别不变,因为我喜欢为应用程序中的其他事务接收此信息。
在logback中,有没有一种方法可以在执行特定方法时暂时禁止另一个库的日志记录?
发布于 2014-05-16 01:53:39
可以:您可以动态设置记录器的日志级别,从而随着时间的推移进行更改。
理想情况下,您需要做的就是将记录器放在相关类层次结构的顶部,并将日志级别设置为您想要的任何级别。例如,使用hibernate:
import ch.qos.logback.classic.Level
import ch.qos.logback.classic.Logger;
import org.slf4j.LoggerFactory;
// When you want to temporarily change the log level
Logger orgHibernateLogger = LoggerFactory.getLogger("org.hibernate");
Level oldLogLevel = orgHibernateLogger.getLevel();
orgHibernateLogger.setLevel(Level.ERROR); // or whatever level you want
// When you want to return to the old log level
orgHibernateLogger.setLevel(oldLogLevel);
只要相关层次结构中的其他记录器都没有显式配置日志级别,就应该可以执行此操作。如果层次结构中的其他记录器显式配置了日志级别,则必须临时调整所有显式设置的日志级别,然后在结束时将它们全部恢复为"normal“。
请注意,这是一种基于时间的方法,而不是基于上下文的方法:如果其他代码在使用临时日志级别时同时使用库,那么它也将获得临时日志级别。日志级别只有在您返回到正常状态时才会恢复到“正常”状态。我不认为有一种简单的方法可以避免这种情况,而不是在您使用临时日志级别时阻止其他代码运行。
编辑:查看Durron597的回答,了解只允许在所需线程中关闭不需要的日志记录的方法。它稍微不那么简单,但看起来应该可以工作。
https://stackoverflow.com/questions/19967244
复制相似问题