29

我正在尝试在我的 android 应用程序中使用 Crashlytics 获取包含一些服务数据的日志。但我没有在仪表板中看到我的日志。我用这个:

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 日志,我需要在记录数据之前初始化 crashlytics。我将 Crashlytics.start(this) 放在我的 Activity 的 onStart() 事件中,但没有再次在仪表板中看到我的日志。最后我尝试在记录我的数据之前直接放置 Crashitycs.start(this) ,但仪表板中仍然没有日志。

请告诉我我做错了什么以及如何在 Crashlytics 仪表板中获取我的自定义日志?

4

4 回答 4

64

我也有类似的情况。通过一些实验,我能够推断出 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

在此处输入图像描述

于 2015-07-18T02:59:58.077 回答
5

根据 Crashlytics 知识库:

记录的消息与您的崩溃数据相关联,如果您查看特定的崩溃本身,它们会在 Crashlytics 仪表板中可见。

根据我的经验,这似乎是真的。但是我不确定是什么决定了哪些日志记录与崩溃报告相关联。也许时间窗口(崩溃前后的时间)或有限数量的日志(崩溃之前)与崩溃报告相关联?

但是 Crashlytics 知识库确实说可以记录异常:

所有记录的异常都将在 Crashlytics 仪表板中显示为“非致命”问题。

因此,如果您将 try/catch 更改为:

try {
   int a = 0;
   a = 1/a;
}
catch (Exception e) {
   CrashLytics.logException(e);
}

然后它应该显示在 Crashlytics 仪表板中。

于 2014-09-25T04:57:58.647 回答
1

这是一个老问题,但由于我今天遇到了同样的问题,我想我应该发布我的解决方案(虽然它在 Kotlin 中)。

由于 Crashlytics 现在是 Google 的 Firebase 产品的一部分,它会在后台初始化,所以我几年前写的一个解决方案必须更新为:

  1. 实现某种日志缓存,先进先出。我根据cache-lite将一个放在一起。
  2. 将此函数放在扩展应用程序的 YourApplicationClass 中:

        fun setExceptionHandler() {
    
           val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
    
           Thread.setDefaultUncaughtExceptionHandler { thread, ex ->
           Crashlytics.log(cacheLoggingTree.getAll().joinToString("++"))
           Crashlytics.logException(ex)
           defaultExceptionHandler.uncaughtException(thread, ex)
           }
        }
    
  3. 然后在 MainActivity 中从 onCreate 函数的末尾调用该函数:

         (application as YourApplicationClass).setExceptionHandler()
    

这样,任何抛出的异常都将首先发布最新的日志条目,然后记录异常。不过,您可能需要谨慎处理缓存的行数,以免系统过载。

此外,当您下载日志时,我使用 ++ 作为标志手动替换为回车,因为我在上传过程中删除了 \n。

于 2019-03-15T20:47:23.157 回答
-1

您可以使用 RuntimeExceptions 代替捕获异常并记录它:

throw new RuntimeException("Test crash");

Android Studio 不会要求您捕获这些,因此应用程序会立即终止并上传报告。

于 2017-07-26T11:28:15.410 回答