如何移除Flutter iOS控制台输出中的iOS原生日志前缀
移除Flutter iOS控制台日志中的原生前缀
我正在开发一款Flutter应用,在iOS平台的控制台输出中遇到问题:使用Flutter的logger包打印的每一行日志前都带有iOS原生消息前缀,导致日志追踪难度极大。我推测该问题可能是在为应用创建flavors后出现的,但无法确定。
日志输出示例:
2023-04-29 11:21:41.997198+0100 <Package Name>[4279:1219892] flutter: My app log message
我希望移除控制台输出中的iOS原生日志前缀(即2023-04-29 11:21:41.997198+0100 <Package Name>[4279:1219892] flutter:部分),以提升日志可读性。
我已尝试在Xcode中禁用OS_ACTIVITY_MODE,但无效果。我不想使用grep过滤日志,因为需要的是移除前缀而非仅过滤日志。
请问如何移除这些原生日志前缀?
解决方法
方法1:自定义Flutter日志输出回调
Flutter的print和第三方logger包最终都会通过Flutter引擎的日志通道输出,你可以通过重定向日志回调直接清理前缀:
在main.dart的main函数中添加以下代码:
import 'dart:io'; import 'package:flutter/foundation.dart'; void main() { if (Platform.isIOS) { // 重定向debugPrint,清理前缀后输出 debugPrint = (String? message, {int? wrapWidth}) { if (message != null) { final cleanedMsg = message.replaceFirst(RegExp(r'^.*flutter: '), ''); stdout.writeln(cleanedMsg); } }; } runApp(MyApp()); }
如果使用的是logger第三方包,可直接配置其输出回调,绕过Flutter默认的前缀添加:
import 'dart:io'; import 'package:logger/logger.dart'; void main() { final logger = Logger( output: IOSCleanLogOutput(), printer: PrettyPrinter(methodCount: 0), // 按需调整打印格式 ); runApp(MyApp()); } class IOSCleanLogOutput extends LogOutput { @override void output(OutputEvent event) { if (Platform.isIOS) { event.lines.forEach(stdout.writeln); } else { event.lines.forEach(print); } } }
方法2:修改iOS原生日志处理逻辑
Flutter在iOS端通过原生通道输出日志,你可以拦截并清理前缀:
打开iOS项目的AppDelegate.swift,添加以下代码:
import Flutter import UIKit @UIApplicationMain class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // 拦截Flutter日志输出,清理前缀后打印 FlutterViewController.setChannelCallback { channel, message in if channel == "flutter" { let cleanedMessage = message.replacingOccurrences( of: "^.*flutter: ", with: "", options: .regularExpression ) print(cleanedMessage) } else { print(message) } } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
方法3:使用Xcode内置日志过滤规则
无需grep,用Xcode自带的过滤器实现前缀隐藏:
- 打开Xcode控制台,点击右上角「Filter」按钮
- 选择「Edit Filter」创建新过滤器
- 添加规则1:
Message→Contains→flutter: - 添加规则2:
Message→Matches Regular Expression→^.*flutter:,勾选「Negate」 - 保存后,控制台将仅显示
flutter:之后的日志内容
内容的提问来源于stack exchange,提问作者thoughtassault
相关产品推荐
相关产品推荐

