Как я могу поймать журнал сбоев kivy-client и отправить его на свой сервер?

У меня возникают проблемы, когда возникают некоторые проблемы с оборудованием, и мое приложение kivy аварийно завершает работу. Например, на Android или iOS. Обычные пользователи не видят лог, я тоже.

Итак, когда мое приложение запускается, я хочу создать отдельный процесс и как-то посмотреть на статус основного приложения. В случае сбоя я хотел бы отправить журнал ошибок на свой сервер. Итак, как лучше всего это сделать? Может быть, другой процесс лишний и я могу сделать его более простым? И как именно я могу поймать краш-лог?...Спасибо!


person Gleb    schedule 11.01.2014    source источник
comment
Возможно, вы можете использовать atexit:docs.python.org/ 2.7/библиотека/   -  person Arjen Dijkstra    schedule 18.11.2014


Ответы (1)


TLDR: используйте Sentry

Есть разные виды сбоев и разные виды инструментов.

Стандартный сбой: обычно segfault, низкоуровневый сбой, при котором вы ничего не можете сделать. Это то, что вы видите на вкладке Play Store, собственный сбой/арт. Ни одна из трассировок не будет говорить с вами, так как вы увидите трассировку C вашего интерпретатора Python и всех остальных потоков. Пользователь может увидеть «Приложение XXX внезапно закрылось» или что-то в этом роде. Существуют инструменты для отображения более красивого сообщения в случае родного сбоя и отправки его в другое место, но ваше приложение никогда не восстановится. Единственное, что вы можете сделать с такими инструментами, это перезапустить его.

Сбой Python: хорошие новости, вы можете отследить их и получить понятную трассировку. Я предлагаю вам изучить Sentry. Это приложение с открытым исходным кодом, вы можете установить его на свой сервер, и когда в вашем приложении произойдет что-то плохое, вы можете отправить полную трассировку на вашу установку часового. Очень полезный.

Интеграция в Kivy также очень проста:

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

Не забудьте иметь разрешение INTERNET в Android. Если интернета нет, то на консоли два раза не получится. Но это все.

Кроме того, вы можете подключить его к ExceptionManager. Если исключение происходит в основном цикле, то у вас есть возможность перехватить его и не выходить из приложения (игнорировать исключение). Будьте осторожны, если вы делаете что-то важное :D

person tito    schedule 27.11.2014