Flutter 中的 log

本文最后更新于 2021年4月4日 晚上

在 Flutter 的神奇世界中, 有一个非常实用的功能, 即通过 flutter log 命令可以获取真机上日志信息, 而且获取的是所有 flutter 应用的日志, 但这样可能造成自己日志打印的内容被其他人看到. 所以这里介绍一种使用 debugPrint 替换 print 以使发布时的 log 和普通 log 分离的办法.

Flutter log

参考原文详见这个链接, 以下只是简略汇总.

另外这里有一篇比较好的文章介绍如何在 Flutter 中模拟 android 的 flavor 或 iOS 的 scheme.

可以根据当前 APP 执行环境的不同来处理 print. 而方法就是使用 debugPrint 来替换 print 使用. 由于 debugPrint 的功能可以通过向其赋值一个 DebugPrintCallback 来自定义, 故可以像下面这样定义它的功能:

1
debugPrint = (String message, {int wrapWidth}) {};

而在 flutter 中, 可以使用不同的 main 文件来表示不同环境下的入口. 比如 main.dart 是生产环境的 main. 建立一个 main_dev.dart 实现 debug 环境下的 main. 故两个 main 文件中的 debugPrint 就可以使用不同的实现来达到目的.

(方法是死的人是活的, 也可以将 main.dart 作为开发环境下的 main, 而建立一个 main_publish.dart 作为生产环境下的 main, 打包的时候只需要指定正确的 main 文件即可.)

main.dart:

1
2
3
4
5
6
// 生产环境下的 main 函数
void main() {
/// 由于 `DebugPrintCallback` 指定为空的执行体, 故它什么也不做.
debugPrint = (String message, {int wrapWidth}) {};
runApp(MyApp());
}

main_dev.dart:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 有两种 `debugPrint` 实现: `debugPrintThrottled` 和 `debugPrintSynchronously`, 区别详见文档.

import 'package:flutter/foundation.dart';
import 'package:package_info/package_info.dart';

void main() async {
var packageInfo = await PackageInfo.fromPlatform();
var version =
"${packageInfo.packageName} ${packageInfo.version} (${packageInfo.buildNumber})";
debugPrint = (String message, {int wrapWidth}) => debugPrintSynchronouslyWithText(message, version, wrapWidth: wrapWidth);

runApp(MyApp());
}

void debugPrintSynchronouslyWithText(String message, String version, {int wrapWidth}) {
message = "[${DateTime.now()} - $version]: $message";
debugPrintSynchronously(message, wrapWidth: wrapWidth);
}

这样就满足了开发环境下的 log 打印需求, 也保证了生产环境下 log 不会被意外打印, 但前提是需要把 APP 里面的 print 都替换为 debugPrint.


Flutter 中的 log
https://blog.rayy.top/2019/03/17/2019-52-flutter-debugprint/
作者
貘鸣
发布于
2019年3月17日
许可协议