使用crashlytics记录我的数据时出现问题

时间:2014-06-20 22:15:23

标签: android logging crashlytics

我正在尝试使用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仪表板中获取自定义日志?

4 个答案:

答案 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

enter image description here

答案 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产品的一部分,因此它在后台初始化,因此我几年前写的解决方案必须更新为此:

  1. 实施某种日志缓存,先进先出。我根据cache-lite汇总了一个。
  2. 将此函数放在扩展Application的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的身份,因此在下载日志时,我还使用++作为标记来手动替换为回车符。

答案 3 :(得分:-1)

您可以改为使用RuntimeExceptions:

,而不是捕获异常并记录它

throw new RuntimeException("Test crash");

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