Flutter Crashlytics日志捕获到异常

时间:2019-09-18 16:46:04

标签: firebase flutter crashlytics

寻找一些关于如何使用flutter的firebase_crashlytics软件包记录捕获的异常的说明。

如果我正确理解了(并且从运行一些示例代码开始),Crashlytics.instance.log('text');只会将日志添加到下一个崩溃报告中,而不会发送非致命性的问题本身。

我正在寻找与Android上的Crashlytics.logException(e)等效的功能,例如

try {
  throwException();
} catch (e) {
  Crashlytics.logExcpetion(e);
}

它允许您记录捕获的异常,使它们在Crashlytics仪表板中显示为非致命问题。

当前可以通过flutter的firebase_crashlytics软件包实现吗?

现在是通过调用Crashlytics.instance.recordError('text', StackTrace.current)来实现这一目标的方法吗?

非常感谢!

2 个答案:

答案 0 :(得分:2)

答案很简单,是

Crashlytics.instance.recordError()等效于Crashlytics.logExcpetion()

如果您深入研究Flutter firebase_crashlytics源代码,则实际上可以看到涉及到的Android API。

Flutter的recordError()调用Android库中的方法Crashlytics#onError

并跟踪Crashlytics#onError,您会看到它进入了Crashlytics.logException(exception);

附加说明,您还会注意到为什么Crashlytics.instance.log() “只会将日志添加到下一个崩溃报告中” 。这些日志添加到ListQueue<String> _logs,然后打包到下一次调用recordError()

Flutter的invocation of Crashlytics.logExcpetion()的摘要:

_recordError(...) {
     ...
     final String result = await channel
          .invokeMethod<String>('Crashlytics#onError', <String, dynamic>{
        'exception': "${exception.toString()}",
        'context': '$context',
        'information': _information,
        'stackTraceElements': stackTraceElements,
        'logs': _logs.toList(),
        'keys': _prepareKeys(),
      });
}

还有一些参考文献notes for Crashlytics.logExcpetion()

  

为减少用户的网络流量,Crashlytics记录了批次   异常一起发送,并在下次应用启动时将它们发送出去。

     

对于任何单个应用程序会话,仅记录最近的8个   异常被存储。

答案 1 :(得分:0)

为了添加到已接受的答案中,新方法 Crashlytics.instance.recordError() 现在已弃用 FirebaseCrashlytics.instance.recordError(exception, stack)

额外提示: 我遇到了这个问题,其中所有记录的异常都在 Crashlytics 仪表板中的同一问题下分组。这些可能是相同或不同代码组件的不同崩溃。因此,我不得不手动检查崩溃的每个实例以进行验证。

enter image description here

从我自己的测试中,我发现分组基于您传递给上述方法的堆栈跟踪中的最顶层行。幸运的是,Dart 有一种使用 StackTrace.current 获取当前堆栈跟踪的简单方法。

因此要正确地对问题进行分组:获取异常发生时的当前堆栈跟踪并将其传递到 FirebaseCrashlytics.instance.recordError(exception, stack)

希望这对那里的人有所帮助,我在互联网上到处寻找类似的问题,但找不到任何。