在Flutter中,print()、debugPrint()和log()有什么实际区别?
在Flutter中,print()、debugPrint()和log()有什么实际区别?
我正在尝试创建一个用于日志记录的工具。
我需要了解 print()
与 debugPrint()
和 log()
之间的实际区别。
我看到的许多答案已经过时或令人困惑。而且,一些投票最多的答案是相互矛盾的。
我想要以红色打印错误消息。我正在使用 ANSI 代码来实现。
debugPrint("\x1B[31m HelloDebug \x1B[0m");
以上代码会以红色打印。
但是当我使用 log()
时,它不会以红色打印。它会忽略 ANSI 代码。
我发现一个问题是 log() 有一个 error 参数。
如果我传递错误消息,它会默认处理为红色。
在第一个使用 log
的示例中,红色没有出现,因为 ANSI 代码被忽略了。但是在第一个使用 debugPrint
的示例中,它工作正常。在第三个示例中,它默认为红色错误。但是即使是空字符串消息,都会添加额外的一行。
代码:
输出:
是否可以使用 ANSI 代码
来在日志中使用彩色文本?
因为我还有其他 ANSI 代码用来制作不同颜色的文本。
我不想使用 debugPrint,因为如果我频繁打印某些内容,系统会忽略日志。
经过一段时间的研究,我发现 log 函数是在 dart 运行时的 c++ 中实现的。因为 log 函数是 dart sdk 中的外部函数。
external void log(
String message, {
DateTime? time,
int? sequenceNumber,
int level = 0,
String name = '',
Zone? zone,
Object? error,
StackTrace? stackTrace,
});
https://github.com/dart-lang/sdk/blob/main/runtime/lib/developer.cc
在研究过程中,我还看到了一些不同的答案。
下面的答案说 debugPrint
只能在 widget 类内部使用。这个说法仍然正确吗?
https://stackoverflow.com/a/52241553/9248098
编辑:
在使用 debugPrint
并从 Android Studio 终端启动应用程序时,ANSI 颜色在 Android 上起作用,但在 iOS 上运行时,它会在相同的 Android Studio 终端中转义字符。
如果 ANSI 代码的支持基于终端的支持,我无法弄清楚为什么在 iOS 的相同终端中会有问题。
在Flutter中,print()、debugPrint()和log()都可以用于在控制台输出日志信息。然而,它们之间存在一些实际的区别。
首先,debugPrint()类似于print(),但是会应用节流机制,以防止被Android内核丢弃。为了避免在生产代码中使用print(),如果你在VSCode或其他IDE上设置了linter,你会看到一个警告。可以参考Avoid print calls in production code获取更多信息。
为了避免linter错误,可以使用kDebugMode与print()或debugPrint()一起使用,例如:
if (kDebugMode) {
print('test print');
}
// 或者
debugPrint('test debugPrint');
接下来,log()函数允许你在日志输出中包含更多的信息。例如,你可以添加runtimeType和相关的对象,以帮助你调试代码。可以通过以下方式使用log():
log(
'test log',
name: runtimeType.toString(),
error: myObj,
);
另外,你还可以尝试在log()中使用ANSI代码,例如:
log("\x1B[31m HelloDebug \x1B[0m");
然而,这种方法在Android Studio中可能不起作用,可能是因为Android Studio对ANSI代码的支持不够完善。
如果想在release模式下避免debugPrint()输出日志,可以参考stackoverflow上的回答,在代码中覆盖debugPrint()函数来实现,具体可以参考stackoverflow.com/a/74936653/9248098。
print()、debugPrint()和log()在Flutter中都可以用于输出日志信息,但它们之间存在一些实际的区别和用法。