Flutter Crashlytics日志捕获异常

13

想要了解如何使用Flutter的firebase_crashlytics包记录捕获的异常。

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

我正在寻找类似于Android上的Crashlytics.logException(e);等功能。

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

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

目前使用flutter的firebase_crashlytics包可以实现吗?

现在,调用Crashlytics.instance.recordError('text', StackTrace.current)是否是实现此目的的方法?

非常感谢!

2个回答

8
简短的回答是,是的。 Crashlytics.instance.recordError()相当于Crashlytics.logException() 如果您深入研究Flutter firebase_crashlytics源代码,您实际上可以看到涉及哪些Android API。
Flutter的recordError()调用了Android库中的方法Crashlytics#onError
跟踪Crashlytics#onError,您将看到它进入Crashlytics.logException(exception); 另外需要注意的是,您还会注意到为什么Crashlytics.instance.log()“仅会将日志添加到下一个崩溃报告”。这些日志被添加到ListQueue<String> _logs,然后打包到下一个recordError()调用中。
Flutter的Crashlytics.logException()调用的片段:
_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(),
      });
}

关于Crashlytics.logException()的一些参考笔记:

为了减少用户的网络流量,Crashlytics将记录的异常批量处理,并在下次应用程序启动时发送。

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


4

补充一下被接受的答案,Crashlytics.instance.recordError()现在已经被新方法FirebaseCrashlytics.instance.recordError(exception, stack)取代。

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

enter image description here

根据我的测试,分组是基于传入上述方法的堆栈跟踪中的最高行。幸运的是,Dart有一种简单的方法可以使用StackTrace.current获取当前堆栈跟踪。

因此,为了正确分组问题:在异常发生时获取当前堆栈跟踪并将其传递给FirebaseCrashlytics.instance.recordError(exception, stack)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接