【问题标题】:Python APScheduler how to disable loggingPython APScheduler 如何禁用日志记录
【发布时间】:2013-05-26 21:15:16
【问题描述】:

我将 APScheduler 设置为通过 cron 计划每秒运行一次(有点需要/想要)。现在我有记录器将所有内容发送到控制台。

如果不是因为日志记录对我的工作非常重要,那也没关系。但是,我需要记录。我不想要的是 APScheduler 的信息记录。像这样的东西:

2013-05-26 13:05:06,007 的信息:作业“loadavg.run(触发器:cron[year='*', month='*', day='*', week='*', day_of_week='*', hour='*', minute='*', second='*'], next run at: 2013-05-26 13:05:06)" 执行成功
2013-05-26 13:05:06,008 的信息:运行作业“cpu.run(触发:cron[year='*', month='*', day='*', week='*', day_of_week= '*', hour='*', minute='*', second='*'],下次运行时间:2013-05-26 13:05:07)"(预定2013-05-26 13:05 :06)

添加 cron 作业后,我的代码中有这个:

logging.getLogger("apscheduler.scheduler").setLevel(logging.DEBUG)

据我所知,APScheduler 也没有任何配置选项来指定日志记录信息。

我知道我可以将记录器的级别指定为 ERROR 或其他内容,但是当它设置为 INFO 时,我不希望同时记录所有这些(似乎无用的)信息。

【问题讨论】:

    标签: python apscheduler


    【解决方案1】:

    你可以试试这个代码:

    logging.getLogger('apscheduler.executors.default').propagate = False
    

    【讨论】:

    • 无论如何都会打印DEBUG消息,所以需要将记录器级别设置为INFO。
    【解决方案2】:

    这是我的代码,它可以正常工作而不会抱怨缺少处理程序:

    scheduler = BackgroundScheduler()
    scheduler.start()
    scheduler.add_job(every_minute, trigger='cron', second=0, id='every_minute')
    logging.getLogger('apscheduler.executors.default').setLevel(logging.WARNING)
    

    它不会完全禁用调度程序日志记录,但会删除 OP 想要删除的信息消息。

    【讨论】:

    • 就我而言,我使用了logging.getLogger('apscheduler').setLevel(logging.WARNING)。使用'apscheduler.executors.default' 时出现错误。否则,这是最好的解决方案,因为我仍然会收到警告/错误消息,但没有任何信息消息会阻塞我的应用程序日志。
    【解决方案3】:

    我首先假设您正在使用 APScheduler 来实现 类似 cron 的 行为,因为如果您真的每秒都通过 cron(8) 运行,它会

    1. 弄巧成拙,因为 APScheduler claims 它是“比外部运行 cron 脚本更好的替代方案……”
    2. 可能会导致系统崩溃

    这规定,logging module 的美妙之处在于它允许您的应用程序在不接触其代码的情况下广泛控制库的日志记录行为。不幸的是,这让logging 一开始有点难以理解。

    由于INFO 级别报告了您不感兴趣的内容,您可以:

    class NoRunningFilter(logging.Filter):
        def filter(self, record):
            return not record.msg.startswith('Running job')
    
    my_filter = NoRunningFilter()
    logging.getLogger("apscheduler.scheduler").addFilter(my_filter)
    

    这些都可以通过logging configuration file 动态指定,但这比我之前了解的还要神奇。

    【讨论】:

    • 是的,我正在使用 APS 作为类似 cron 的调度程序。感谢过滤器代码,我不得不稍微修改它(
      return
      而不是
      return not record.msg.startswith('Running job')
      )不吐出任何东西,但它对我来说已经足够好了。谢谢!
    • 偶然使用return 是正确的,因为它返回的None 在Python 中恰好是错误的。更好更明确的是return False。请参阅PEP-20 以获得进一步的启发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2014-07-16
    • 2018-12-24
    • 2020-01-17
    • 2016-07-04
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多