【问题标题】:How to log APScheduler warnings with more information?如何使用更多信息记录 APScheduler 警告?
【发布时间】:2014-11-27 21:19:27
【问题描述】:

我正在使用Python APScheduler 运行一堆重复性任务,但是对于一些任务,我现在遇到如下错误:

警告:apscheduler.scheduler:执行作业“getAndStoreExchangeRate(触发器:cron [minute='*'],下次运行时间:2014-11-06 18:48:00 CET)”已跳过:运行实例的最大数量达到 (1)

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

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

  • 此函数在哪个文件的哪一行出现警告?
  • 为该函数提供了哪些参数?

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

[编辑]

所以我继承了 BackgroundScheduler 并覆盖了 _process_jobs() 方法,在该方法中我在这个 sn-p 中更改了 self._logger.warning:

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),

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

【问题讨论】:

  • 了解您正在运行的 APScheduler 版本会很有用。
  • @AlexGrönholm - 啊,我忘了说;我正在运行版本 3.0.0..
  • @AlexGrönholm - 看到您询问版本,您知道我如何存储此函数的文件名、行号和参数吗?我有点迷路了……

标签: python logging error-handling apscheduler


【解决方案1】:

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

我建议您子类化您选择的调度程序并复制 _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

【讨论】:

  • 感谢您的提示。您能否对我如何做到这一点提出建议?我是否需要继承 BaseExecuter 并覆盖 submit_job 方法?还是我需要分叉完整的代码并弄乱它。你会通过一个小代码示例对我有很大帮助..
  • 嗨,Alex,感谢一百万。它让我更进一步。不过,我又有点卡住了;我只有job 变量,但我如何实际获取我想要记录的信息(提供给该作业的参数以及定义作业函数的文件和行号)?很抱歉再次问你,但如果我能解决这个问题,你真的会让我很高兴。
  • 它们是 Job 实例的属性。只需查看 API 文档以供参考。
  • 嗨,亚历克斯。再次感谢您的帮助。我现在差不多了。我编辑了我的问题以显示我如何对_process_jobs() 方法进行子类化。我不知道的最后一件事是如何找出被调用函数是在哪个文件中定义的?我想我会以某种方式需要检查模块,但我有点迷失了如何做到这一点。任何想法? (在那之后我保证我不会再打扰你了.. :))
猜你喜欢
  • 2017-09-07
  • 2017-06-30
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2018-09-27
  • 2010-11-19
相关资源
最近更新 更多