日志方法对比
输出方式 | 调试模式控制台输出 | 发布模式控制台输出 | DevTools Logging 视图 |
---|---|---|---|
print() |
✅ 显示 | ✅ 显示 | ❌ 不显示 |
debugPrint() |
✅ 显示 | ✅ 显示 | ❌ 不显示 |
stderr.writeln() |
✅ 显示 | ✅ 显示 | ✅ 显示 |
dart:developer.log() |
✅ 显示 | ❌ 不显示 | ✅ 显示 |
详细说明:
-
print()
:在调试模式和发布模式下都会输出到控制台,但不会显示在 DevTools 的 Logging 视图中。 -
debugPrint()
:在调试模式和发布模式下都会输出到控制台,但不会显示在 DevTools 的 Logging 视图中。 -
stderr.writeln()
:在调试模式和发布模式下都会输出到控制台,并且会显示在 DevTools 的 Logging 视图中,适用于输出错误信息。 -
dart:developer.log()
:在调试模式下会输出到控制台,会显示在 DevTools 的 Logging 视图中,适用于生成结构化的日志事件。
同时输出到控制台和 DevTools 的建议:
要实现日志同时显示在控制台和 DevTools 的 Logging 视图中,建议使用 stderr.writeln()
。这种方法的输出既能在控制台查看,也能在 DevTools 中进行结构化分析。
如果您希望在调试模式下使用 print()
或 debugPrint()
,并在发布模式下使用 stderr.writeln()
,可以通过以下方式实现:
Dart
import 'dart:io';
void logMessage(String message) {
if (kReleaseMode) {
stderr.writeln(message); // 发布模式下输出到 stderr
} else {
print(message); // 调试模式下输出到控制台
}
}
在上述代码中,logMessage
函数会根据当前模式选择合适的输出方式。
使用这种方法,您可以在调试模式下使用 print()
或 debugPrint()
,在发布模式下使用 stderr.writeln()
,从而实现日志同时显示在控制台和 DevTools 的 Logging 视图中。
验证debug模式
注意:debug模式 我发现怎么都可以显示在devtools面板中
🔍 性能对比与使用建议
方法 | 性能影响 | 特点与适用场景 |
---|---|---|
print() |
中等(同步阻塞) | 简单直接,适用于开发阶段的快速调试。在生产环境中频繁使用可能导致性能下降。 |
debugPrint() |
较低(异步处理) | 自动分段长文本,防止日志丢失。适用于输出长文本,开发阶段使用。 |
developer.log() |
低(结构化日志) | 支持日志级别、时间戳等元信息,适用于需要结构化日志的调试和分析阶段。在生产环境中不会输出到控制台。 |
stderr.writeln() |
中等(同步阻塞) | 将错误信息输出到标准错误流,适用于错误日志的输出。在生产环境中使用需谨慎,可能影响性能。 |
设置 debugPrint
为自定义函数(动态控制开关)
Dart
bool enableDebugLog = true;
void initDebugPrint() {
debugPrint = (String? message, {int? wrapWidth}) {
if (enableDebugLog && message != null) {
print('📘 $message'); // 你可以替换成你自己的逻辑
}
};
}
使用 Zone 拦截 print
(高级玩法)
Dart
void main() {
runZonedGuarded(() {
runApp(MyApp());
}, (error, stack) {}, zoneSpecification: ZoneSpecification(
print: (self, parent, zone, line) {
if (kDebugMode) {
parent.print(zone, "📘 $line");
}
},
));
}