如何捕获 kivy-client 崩溃日志并将其发送到我的服务器?

Posted

技术标签:

【中文标题】如何捕获 kivy-client 崩溃日志并将其发送到我的服务器?【英文标题】:How can I catch kivy-client crash log and send it to my server? 【发布时间】:2014-01-30 12:45:42 【问题描述】:

当出现一些硬件问题并且我的 kivy 应用程序崩溃时,我遇到了问题。例如在 androidios 上。普通用户看不到日志,我也看不到。

所以,当我的应用程序启动时,我想创建单独的进程并以某种方式查看主应用程序的状态。万一它崩溃了,我想将错误日志发送到我的服务器。那么,最好的方法是什么?也许另一个过程是多余的,我可以用更简单的方式制作它?以及如何准确地捕获崩溃日志?...谢谢!

【问题讨论】:

也许你可以使用 atexit:docs.python.org/2.7/library/… 【参考方案1】:

TLDR:使用Sentry

有不同类型的崩溃和不同类型的工具。

本机崩溃:通常是段错误,是您无法真正做任何事情的低级崩溃。这就是您在 Play 商店标签上看到的内容,原生崩溃/艺术。任何回溯都不会与您交谈,因为您将看到 Python 解释器和所有其他线程的 C 跟踪。用户可以看到“应用程序 XXX 突然退出”或类似的内容。有一些工具可以在本机崩溃的情况下显示更好的消息并将其发送到其他地方,但您的应用程序将永远无法恢复。使用此类工具您唯一能做的就是重新启动它。

Python 崩溃:好消息,您可以捕获它们并进行可理解的回溯。我建议您查看Sentry。它是开源的,你可以在你的服务器上安装哨兵,当你的应用程序发生错误时,你可以将完整的回溯发送到你的哨兵安装。很有用。

集成到 Kivy 也很简单:

if __name__ == "__main__":
    import traceback
    from raven import Client
    client = Client('requests+http://XXKEYXX@sentry.yourserver.com/sentry/1')
    try:
        YourApp().run()
    except:
        traceback.print_exc()
        ident = client.get_ident(client.captureException())
        print "Exception caught; reference is %s" % ident

不要忘记在 Android 中拥有 INTERNET 权限。如果没有互联网,它会在控制台上失败两次。但仅此而已。

此外,您可能希望将其插入 Kivy 的 ExceptionManager。如果异常发生在主循环中,那么您有可能捕获它而不退出应用程序(忽略异常)。当心你是否正在做一些重要的事情:D

【讨论】:

以上是关于如何捕获 kivy-client 崩溃日志并将其发送到我的服务器?的主要内容,如果未能解决你的问题,请参考以下文章

Android应用崩溃后异常捕获并重启并写入日志

如何使用应用洞察来捕获物联网边缘设备日志?

Android捕获崩溃异常

如何从 wxPython 应用程序中捕获所有异常?

有没有办法从 Sentry 捕获日志并将它们发布到我的自定义后端?

android如何以编程方式仅捕获应用程序中的日志条目