【发布时间】:2020-10-10 23:40:20
【问题描述】:
我使用来自import 'dart:developer'; 的log,但是当我从单元测试中使用时,它似乎没有打印任何内容。
我应该使用什么来登录测试和开发环境而不是生产环境?
谢谢。
【问题讨论】:
标签: flutter flutter-test
我使用来自import 'dart:developer'; 的log,但是当我从单元测试中使用时,它似乎没有打印任何内容。
我应该使用什么来登录测试和开发环境而不是生产环境?
谢谢。
【问题讨论】:
标签: flutter flutter-test
通过dart:developer log() 发送的消息将通过 Dart VM 的本机代码实现处理,请注意src code 中的external 函数定义。然后,Flutter Devtools 等工具可以免费订阅接收和显示这些消息。
在 Flutter 应用程序中,日志记录将发送到通常的应用程序控制台输出,但是如果您将其用于 Dart 命令行应用程序或在为 Flutter 应用程序运行单元测试时想要输出,您应该能够通过 IDE 看到,理论上 VSCode 和 IntelliJ Dart/Flutter 插件都添加了明确的支持来显示log() 的输出,尽管目前是DartCode there maybe a bug preventing that 的情况。
理论上,您还可以使用 Dart vm_service 包添加支持,以在运行单元测试时自行读取日志消息并将其发送到 stdout/stderr,但在这种情况下,切换到使用 @ 可能会更容易987654323@ 然后您可能希望在 Logger 的 listen() 回调中显式地将输出发送到 stdout 和/或 stderr:
// pass true to enable output to stderr
Logger.root.onRecord.listen((LogRecord rec) {
final mesg = '${rec.level.name}: ${rec.time}: ${rec.message}';
if (true == useStd) {
if (rec.level >= Level.SEVERE) {
stderr.writeln('$mesg\n${rec.error}\n${rec.stackTrace}');
} else {
stdout.writeln(mesg);
}
} else {
developer.log(mesg, level: rec.level.value, error: rec.error);
}
});
【讨论】:
package:logging 的Logger,而不是本问题所要求的dart:developer。
dart:developer 的用法。
dart:developer 仅适用于 Dart vm 服务可用的调试环境。因此,启动带有调试器的单元测试应该可以正常工作。它以编程方式与 Dart VM 和调试器进行交互,因此如果没有附加它们,它将无法正常工作。
但是,日志记录对生产环境也很有帮助,因此我建议迁移到不同的软件包,以获得跨环境的强大日志记录服务。 dart:developer 并非设计为记录器。
【讨论】:
dart:developer 不仅在“调试环境”中工作,而且它的文档也没有说明它只在“调试环境”中工作:api.flutter.dev/flutter/dart-developer/…
dart:developer 需要附加调试器。实际尝试后告诉我。
dart:developer 主要用于调试器/inspector,但是这个问题特别是关于使用log() 并且特别是关于在运行单元测试时查看它的输出。为此,您不需要需要调试器,VSC Dartcode 和 AS 插件都支持显示 log() 输出,但实际上在 VSC 中对其进行测试,现在似乎是一个错误,因为它的支持:@987654322 @。我编辑了您的答案以澄清对 vm 服务的需求并推翻了反对意见并更新了我的答案。