如何使用更多信息记录APScheduler警告?

时间:2014-11-27 21:19:28

标签: python logging error-handling apscheduler

我使用Python APScheduler运行一系列重复性任务,但对于几项任务,我现在遇到错误,例如:

  

警告:apscheduler.scheduler:执行job" getAndStoreExchangeRate(触发器:cron [分钟=' *'],接下来运行于:2014-11-06 18:48:00 CET )"已跳过:达到最大运行实例数(1)

除此之外,此APscheduler实例的已用内存量在运行大约十天后突然上升,从大约47MiB到1200MiB,之后各种进程因机器内存不足而停止。

因此,为了找到问题的根源,我需要准确理解哪些调用会导致这些警告。据我所知,发生此错误是因为之前的呼叫(在此之前一分钟)尚未结束。但是,此错误中的信息相当模糊。给出了函数的名称(getAndStoreExchangeRate),但我有多个文件,其函数名为this。所以我想知道的是:

  • 哪个文件在哪个行上发出警告?
  • 这个函数有哪些参数?

有人知道如何在某处记录这些信息吗?欢迎所有提示!

[编辑]

所以我将BackgroundScheduler子类化并覆盖了我更改了此片段中self._logger.warning的_process_jobs()方法:

try:
    executor.submit_job(job, run_times)
except MaxInstancesReachedError:
    self._logger.warning(
        'Execution of job "%s" skipped: maximum number of running instances reached (%d)',
        job, job.max_instances
    )
except:
    self._logger.exception('Error submitting job "%s" to executor "%s"', job, job.executor)

到此:

'Execution of job "%s" skipped: maximum number of running instances reached (%d) =-= ARGS: ' + str(job.args) + ' - KWARGS: ' + str(job.kwargs),

这是因为它向我展示了给函数的参数,但我仍然不知道最重要的事情:在哪个文件中以及在哪一行上定义了发生警告的函数。有谁知道我怎么能证明这一点?

1 个答案:

答案 0 :(得分:1)

最简单的方法是在_process_jobs()方法的apscheduler.schedulers.base模块的“除MaxInstancesReachedError:”块之外添加额外的日志记录语句。在那里你可以访问job.func,它是作业的目标函数。

我建议您将选择的调度程序子类化,并复制_process_jobs方法代码。然后修改除MaxInstancesReachedError块之外的其他块:

try:
    executor.submit_job(job, run_times)
except MaxInstancesReachedError:
    self._logger.warning('Execution of job "%s" skipped: maximum number of running instances reached (%d)', job.func, job.max_instances)

修改

该函数的文件名: job.func .__ code __。co_filename

行号: job.func .__ code __。co_firstlineno