【问题标题】:How to log a Python crash?如何记录 Python 崩溃?
【发布时间】:2013-02-27 11:43:23
【问题描述】:

我在树莓派中运行 python 代码。该代码应该永远存在。但是,几个小时后它崩溃了。由于它在远程机器上运行,我看不到它在崩溃期间给出的消息。

如何将此消息存储在文件中,以便查看问题所在?这是在linux中自主完成的吗?或者我应该编写一些函数来在崩溃期间导出错误。我该怎么做?

【问题讨论】:

  • 你是如何启动你的 Python 程序的?
  • “由于它在远程机器上运行,我看不到它在崩溃期间给出的消息。”这真的不应该是一个限制。
  • 我 ssh raspberrypi 并运行 python 代码:sudo python file.py

标签: python


【解决方案1】:

如果进程是这样​​启动的,您可以将输出存储在文件中:

python script.py >> /logdir/script.py.log 2>&1

【讨论】:

  • 是否可以在终端查看日志,同时登录script.py.log?
  • @alandalusi 使用tail -f /logdir/script.py.log 观看日志。
  • 有趣的是,与在终端上运行脚本不同,结果不会实时放在日志文件中。有什么原因吗?
  • 这可能是因为tail的睡眠间隔。你可以这样设置:“tail -s 0.1 -f /logdir/script.py.log”
  • 这可能是因为缓冲stackoverflow.com/questions/107705/python-output-buffering 需要测试这个解决方案虽然
【解决方案2】:

你可以拥有一个主函数并在主函数崩溃时登录

def main():
   ...
   raise ValueError("Crashed because I'm a bad exception")
   ...

if __name__ == "__main__":
   try:
      main()
   except Exception as e:
      logger.exception("main crashed. Error: %s", e)

如果您使用类似 logstash 的东西并想在您的 UI 上查看错误和时间,这会更好。

感谢Eric改进答案

【讨论】:

  • 使用logger.exception('main crashed'),它也会打印堆栈跟踪
  • 随意编辑我的答案以包含 logger.exception
  • 确保在某个时候设置日志记录。 Python 3.9:logger.basicConfig(filename=..., encoding='utf-8', level=logger.DEBUG)。该库也称为logging,而不是logger。 (所以对于上面的代码,你需要import logging as logger。)
  • 3.8 没有参数编码,所以logger.basicConfig(filename=..., level=logger.DEBUG)。见Python docs for details (in your language :)
【解决方案3】:

我自己也尝试过很多次,但都觉得很奇怪……直到我想通了! 只需在您的 python 文件周围编写此代码,一切都会好起来的! 顺便说一句,我将把崩溃日志命名为 CRASH-,然后是 python 时间(例如 CRASH-1607012036.015824.txt)

try:
    <your program here>
except Exception as e:
    crash=["Error on line {}".format(sys.exc_info()[-1].tb_lineno),"\n",e]
    print(crash)
    timeX=str(time.time())
    with open("monstergame/crashlogs/CRASH-"+timeX+".txt","w") as crashLog:
        for i in crash:
            i=str(i)
            crashLog.write(i)

注意:这是 Python 3 代码,而不是 Python 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多