“apscheduler.executors.default”日志记录器找不到处理程序?

4

我有一个Python脚本在Heroku上每晚通过任务运行。偶尔会出现以下错误导致脚本无法执行(最近更加频繁)。

2015-02-25T05:00:02.671242+00:00 app[clock.1]: No handlers could be found for logger "apscheduler.executors.default"

该脚本使用Procfile中定义的内置时钟方法进行执行。

clock.py:

import sys
import logging

sys.path.append('main')

from main import main
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

# Executes every night at 5:00am UTC time | 12:00am (midnight) Winston-Salem, NC time
@sched.scheduled_job('cron', hour=5)
def scheduled_job():
    logging.basicConfig()
    main()

sched.start()

我在网上搜索了一下,根据我读到的少数回应,人们说这是一个警告而不是错误。然而,当它出现时,这个问题会导致整个脚本失败。我的问题首先是,有没有修复这个问题的方法?其次,为什么有时候会出现这种情况,而不是总是

许多人建议简单地将以下内容添加到脚本中:

import logging
logging.basicConfig()

正如您所看到的,我已经尝试了,但问题仍然存在。


你把它加错了地方。在实例化调度程序之前调用logging.basicConfig()。这样可以让你看到真正的问题所在。 - Alex Grönholm
@AlexGrönholm 我使用了你的建议,终于让它正常工作了。但是,现在这个已声明的记录器阻止了我应用程序中的其他记录器显示其结果。是否可以解决这个问题?如果我不希望apscheduler的记录器完全接管整个日志系统怎么办? - carbon_ghost
APScheduler的记录器并不会阻止其他记录器工作。肯定还有其他问题存在,但考虑到我对您代码的了解非常有限,我无法确定具体是什么问题。 - Alex Grönholm
2个回答

10
import logging

log = logging.getLogger('apscheduler.executors.default')
log.setLevel(logging.INFO)  # DEBUG

fmt = logging.Formatter('%(levelname)s:%(name)s:%(message)s')
h = logging.StreamHandler()
h.setFormatter(fmt)
log.addHandler(h)

我用了一个不错的格式,使我的东西能够工作


1
我遇到过同样的情况;问题可能是由于您的代码中出现了一些异常,这些异常与apscheduler尝试记录它们之间存在冲突。建议根据最近的文档,尝试运行没有sys和logger的Apscheduler,而只是导入os。
然后,请检查任务函数中是否存在任何有问题的bug或未捕获的异常(这可能是可能的),并启动调度程序。
如果您在函数中找不到问题,则避免使用sys,改为导入os和基本日志记录器(它可能会帮助您发现问题)。
希望这对您也有所帮助。

你的回答帮了我很多。当我在隔离环境中测试调用的函数时,它抛出了一些异常。我修复了我的函数,错误已经消失了。 - Ravi Chandra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接