Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用crashlytics记录数据时遇到问题_Android_Logging_Crashlytics - Fatal编程技术网

Android 使用crashlytics记录数据时遇到问题

Android 使用crashlytics记录数据时遇到问题,android,logging,crashlytics,Android,Logging,Crashlytics,我试图在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.E

我试图在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.start(此)放在我的活动的onStart()事件中,但在仪表板中没有再次看到我的日志。最后,我尝试在记录数据之前直接将Crashlitycs.start(this)放在仪表板中,但仪表板中仍然没有日志


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

根据Crashlytics知识库:

记录的消息与您的崩溃数据关联,并且在中可见 如果查看特定的崩溃本身,将显示Crashlytics仪表板

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

但是Crashlytics knowledgebase确实表示可以记录异常:

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

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

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

然后它会出现在Crashlytics仪表板上。

我也遇到过类似的情况。通过一些实验,我能够推断出Crashlytics行为的规则

我在这里分享我的经验教训,这样(希望)其他人就不必像我一样经历艰苦和耗时的过程来找出答案

如果发生致命异常,Crashlytics仅会立即将崩溃报告“上载到仪表板”。换句话说,当你的应用程序崩溃时。除非上传崩溃报告,否则仪表板上不会显示任何内容

如果您使用
CrashLytics.logException(e)
记录非致命异常,则在下次重新启动应用程序之前,将不会上载故障报告。因此,在应用程序重新启动之前,您不会在Crashlytics仪表板中看到异常

您可以知道何时发生上载,因为您将在LogCat中看到此类消息:

07-17 19:30:41.47718815-18906/com.foo.bar I/Crashlytics﹕ Crashlytics报告上载完成:55A9BA0C01D7-0001-462D-B8B4C49333.cls

Crashlytics日志消息必须与致命或非致命异常关联,才能显示在仪表板中

此外,与异常无关的日志消息不会在应用程序重新启动后继续存在

因此,如果您执行类似于记录一些消息的操作,然后重新启动应用程序,然后应用程序抛出异常,或者使用
Crashlytics.logException()
记录非致命异常,那么日志消息将丢失。它们不会出现在仪表板中

如果要记录一些没有致命异常的消息,请使用一个或多个
Crashlytics.log()
语句,后跟
Crashlytics.logException()

要验证它是否有效,请运行代码,然后重新启动应用程序。在仪表板中,您应该看到与为非致命异常创建的问题相关联的日志。在野外,你只需要信任你的用户,然后有规律地重新启动应用程序

在Fabric/Crashlytics仪表板上,您需要选择
所有事件
或(如果您只想查看日志调用)
非致命事件


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

抛出新的运行时异常(“测试崩溃”)


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

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

Crashlytics现在是谷歌Firebase产品的一部分,它在幕后进行初始化,因此我几年前写的一个解决方案必须更新为:

  • 实现某种日志缓存,先进先出。我把一个放在一起的基础上
  • 将此函数放入扩展应用程序的ApplicationClass中:

        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已被剥离。

    如果我调用Crashlytics.logException()。应用程序重新启动后,我可以在仪表板上看到此日志。但在Crashlytics.log(android.util.log.INFO,tag,msg)、Crashlytics.log(android.util.log.ERROR,tag,msg)、Crashlytics.log(android.util.log.DEBUG,tag,msg)之前和之后调用的另一个日志Crashlytics.log(android.util.log.DEBUG,tag,msg)不会出现在仪表板上。请帮助我如何让它们显示在仪表板上。如何记录与致命或非致命异常相关的Crashlytics日志消息?感谢用户?从未!这需要打印出来并贴在墙上!你,先生!你是一个传奇!我希望日志存储在本地,上传时不会丢失close@RafaelLima-帮助调试为何崩溃报告工具无法工作的开发人员。在这种特定情况下,需要故意破坏应用程序。在你否决我之前,你读过这个问题吗?或者考虑问我的理由是什么?可能你没有,simple跳到了你能找到的最简单的解决方案中,以获得一些选票。。。一些人认为,问题是如何通过crashlytics跟踪应用程序的正常使用