【问题标题】:Obtaining exception message from failed rq job从失败的 rq 作业中获取异常消息
【发布时间】:2019-03-12 13:59:37
【问题描述】:

我正在使用带有q.enqueue_call(...) 的 rq 运行一项工作,在这项工作中我使用raise Exception('URL not found') 提出了一个异常

我想知道在作业失败后如何从该作业中获取异常消息(“找不到 URL”)。

我可以得到堆栈跟踪

print(get_failed_queue(connection=conn).jobs[-1].exc_info)

虽然似乎无法获得简短的错误消息本身。

我认为job.result(在获得job = Job.fetch(job_key, connection=conn) 的工作后)会起作用,尽管这会返回None

【问题讨论】:

    标签: python redis queue jobs


    【解决方案1】:

    据我所知,你不能只得到最后一条错误消息:你要么可以得到堆栈跟踪,要么可以得到函数返回的值。来自文档here

    Python 函数可能有返回值,因此作业也可以有返回值。如果一个作业返回一个非 None 返回值,worker 会将该返回值写回到该作业的 Redis 哈希中的 result 键下。作业完成后,作业的 Redis 哈希默认会在 500 秒后过期。

    exc_info 包含以下内容:

    当作业内部抛出异常时,它会被工作程序捕获,序列化并存储在作业的 Redis 哈希的 exc_info 键下。对作业的引用被放入失败的队列中。

    我发现获取错误消息的最佳方法是获取 exc_info 并解析它 - 通常在 raise 或类似的地方 - 然后从拆分中获取最后一个值。像这样返回最后一个错误:

    job.__dict__["exc_info"].split("raise")[-1]
    

    【讨论】:

      【解决方案2】:

      这可能会有所帮助

      $ redis-cli
      > hget rq:job:name exc_info
      "x\x9c\r..."
      
      $ python
      > import zlib
      > zlib.decompress("x\x9c\r...")
      

      【讨论】:

        猜你喜欢
        • 2013-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-19
        • 2013-02-01
        • 1970-01-01
        相关资源
        最近更新 更多