我正在尝试使用Crashlytics在我的Android应用程序中获取带有一些服务数据的日志。但我没有在仪表板中看到我的日志。 我用过这个:
String myLog = getServiceData(); //myLog is not null and non-empty
CrashLytics.log(myLog);
和此:
String myLog = getServiceData(); //myLog is not null and non-empty
CrashLytics.log(Log.Error, getString(R.string.app_name), myLog);
我试图在我的应用程序中生成异常并处理它,但没有结果:
try {
int a = 0;
a = 1/a;
}
catch (Exception e) {
CrashLytics.log(myLog);
}
另外我在Crashlytics log not sent上阅读我需要在日志数据之前初始化crashlytics。我把Crashlytics.start(this)放在我的Activity的onStart()事件中,但没有再次在仪表板中看到我的日志。最后我尝试在记录数据之前直接放置Crashlitycs.start(this),但仪表板中仍然没有日志。
请告诉我,我的错误以及如何在Crashlytics仪表板中获取自定义日志?
答案 0 :(得分:57)
我有类似的情况。通过一些实验,我能够将规则推广到Crashlytics'行为。
我在这里分享我的学习,所以(希望)其他人不必经历我所做的艰苦而耗时的过程。
Crashlytics只会将崩溃报告"上传到仪表板"如果发生致命异常则立即换句话说,当您的应用程序崩溃时。除非上载崩溃报告,否则仪表板中不会显示任何内容。
如果您使用CrashLytics.logException(e)
记录非致命异常,则崩溃报告将不上传,直到您下次重新启动应用时为止。因此,您将不在Crashlytics仪表板中查看异常,直到应用重启。
您可以判断上传的时间,因为您会在LogCat中看到此类消息:
07-17 19:30:41.477 18815-18906/com.foo.bar I/Crashlytics﹕ Crashlytics report upload complete: 55A9BA0C01D7-0001-462D-B8B4C49333333.cls
Crashlytics日志消息必须与致命或非致命异常相关联才能显示在仪表板中。
此外,与异常关联的日志消息不会在应用重启后生效。
因此,如果您执行某些操作,例如记录一些消息,然后重新启动应用程序,然后应用程序抛出异常,或者使用Crashlytics.logException()
记录非致命异常,则日志消息将为丢失即可。它们不会显示在仪表板中。
如果要记录一些没有致命异常的消息,请使用一个或多个Crashlytics.log()
语句,后跟Crashlytics.logException()
。
要验证它是否有效,请运行代码,然后重新启动应用。在仪表板中,您应该看到与为非致命异常创建的问题相关联的日志。在野外,您只需要相信您的用户有规律地重启应用程序。
在Fabric / Crashlytics信息中心,您需要选择All Events
或(如果您只想查看日志记录电话)Non-Fatals
。
答案 1 :(得分:5)
根据Crashlytics知识库:
记录的消息与您的崩溃数据相关联,并且可见 如果您查看特定的崩溃本身,请使用Crashlytics仪表板。
根据我的经验,这似乎是真的。但是,我不确定是什么决定了哪个日志记录与崩溃报告相关联。也许时间窗口(崩溃时间)或有限数量的日志(崩溃前)与崩溃报告相关联?
然而,Crashlytics知识库确实可以记录异常:
所有记录的异常将显示为"非致命异常"问题在 Crashlytics仪表板。
因此,如果您将try / catch更改为:
try {
int a = 0;
a = 1/a;
}
catch (Exception e) {
CrashLytics.logException(e);
}
然后它应该出现在Crashlytics仪表板中。
答案 2 :(得分:0)
这是一个古老的问题,但是由于我今天遇到同样的问题,所以我认为应该发布我的解决方案(尽管它在Kotlin中)。
由于Crashlytics现在已成为Google Firebase产品的一部分,因此它在后台初始化,因此我几年前写的解决方案必须更新为此:
将此函数放在扩展Application的YourApplicationClass中:
fun setExceptionHandler() {
val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
Thread.setDefaultUncaughtExceptionHandler { thread, ex ->
Crashlytics.log(cacheLoggingTree.getAll().joinToString("++"))
Crashlytics.logException(ex)
defaultExceptionHandler.uncaughtException(thread, ex)
}
}
然后您从MainActivity中的onCreate函数的末尾调用该函数:
(application as YourApplicationClass).setExceptionHandler()
这样,抛出的任何异常都将首先发布最新的日志条目,然后记录该异常。您可能要谨慎缓存多少行,以免使系统过载。
此外,由于我在上载过程中剥夺了\ n的身份,因此在下载日志时,我还使用++作为标记来手动替换为回车符。
答案 3 :(得分:-1)
您可以改为使用RuntimeExceptions:
,而不是捕获异常并记录它 throw new RuntimeException("Test crash");
Android Studio不会要求您捕获这些内容,因此让应用程序终止并立即上传报告。