是否可以将所有控制台输出写入Dart / Flutter中的变量

9ceoxa92  于 2023-02-13  发布在  Flutter
关注(0)|答案(1)|浏览(218)

我已经部署了我的flutter应用程序,一个用户说某个部分不工作。因此,我有兴趣找到一种方法,将通常转储到控制台的所有输出写入字符串。然后,我可以将此字符串发送给自己,并使用它来调试问题。
有没有订阅所有控制台输出的方法?我找到了runZoned(() => ...),但这似乎只收集某些日志,特别是没有来自其他隔离的日志。

nxowjjhe

nxowjjhe1#

理论上,可以捕获所有日志输出,然后将其存储为变量。但实际上,这需要大量工作,而且可能需要提升权限才能从应用本身访问日志流(这在没有root设备的iOS上可能无法实现)。
但是,我建议您颠倒一下等式--不是检索日志输出,而是首先在日志到达控制台之前捕获它们。
这就是logger这样的软件包的优势所在。通过日志服务路由所有的print语句,您可以设置中间件来捕获通过管道的输出。这样,您可以存储所有的输出,而不必处理操作系统权限和特权之类的事情。

final buffer = BufferOutput();
final logger = Logger(output: buffer);

class BufferOutput extends LogOutput {
  final lines = <String>[];

  @override
  void output(OutputEvent event) {
    lines.addAll(event.lines);
    for (var line in event.lines) {
      print(line);
    }
  }
}

用法:

logger.v("This is verbose text");
logger.d("This is debug text");
logger.i("This is info text");
logger.w("This is warning text");
logger.e("This is error text");
logger.wtf("This is what-the-fudgestickles text");

print(buffer.lines);

// Output:
// ["This is verbose text","This is debug text","This is info text","This is warning text","This is error text","This is what-the-fudgestickles text"]

注意:如果你想捕获正常的应用日志记录输出,这是可行的。如果你想自动捕获异常日志输出,你最好使用CrashlyticsSentry之类的工具来捕获和整理这些错误日志,因为根据错误的不同,你不能指望你的应用代码在错误发生后能够运行。

相关问题