Dart/Flutter中developer.log接口无法正常打印输出日志问题
问题成因
dart:developer库下的log()是Dart专为调试场景设计的接口,它不会直接将日志写入stdout/stderr,而是将日志事件上报给Dart虚拟机的调试服务。只有当有调试器(如Dart DevTools、IDE调试组件)附着在运行进程上时,这些日志才会被调试工具捕获展示。- 你使用的
logging第三方包和dart:developer是完全独立的两套日志体系,Logger.root.onRecord.listen只能监听logging包生成的日志事件,完全无法接收developer.log()的输出,所以该配置不能解决问题。 - 无调试附加的命令行运行、DartPad运行场景下,默认没有开启调试服务也没有组件处理
developer.log()的事件,因此这部分日志不会出现在输出结果中。
解决方案
根据你的使用场景可以选择对应方案:
命令行运行Dart代码查看日志
运行代码时添加--observe参数开启调试服务,命令格式如下:
<dart_sdk_path>/dart-sdk/bin/dart run --observe --enable-asserts <project_path>/<file>.dart
运行后按照控制台提示打开Dart DevTools,在「日志」面板即可查看所有developer.log()输出的内容。
Flutter开发场景
Debug模式下用flutter run启动应用时,Android Studio、VS Code等IDE默认会自动捕获developer.log()的输出并展示在控制台,无需额外配置。Release模式下调试服务会被关闭,developer.log()不会产生任何输出,生产环境建议使用print或logging包实现日志写入文件或上报。
通用兼容方案
如果需要不管有没有调试器附着都能看到developer.log()的内容,可以自行封装日志工具,调用developer.log()的同时同步输出到stdout,示例代码如下:
import 'dart:developer' as developer; void log(String message, {String name = ''}) { developer.log(message, name: name); print(name.isEmpty ? message : '[$name] $message'); }
后续打日志直接调用封装后的log()方法即可同时兼容调试场景和普通运行场景的日志展示。
内容的提问来源于stack exchange,提问作者Pavel Moukhataev
相关产品推荐
相关产品推荐

