flutter如何实现日志过滤

在Flutter开发中,如何实现日志过滤功能?目前使用print或debugPrint输出的日志太多,想根据特定标签或级别(如Error/Warning/Info)过滤显示,是否有推荐的插件或自定义方案?最好能支持动态开关不同模块的日志输出。

2 回复

Flutter中可通过以下方式实现日志过滤:

  1. 使用debugPrint替代print,可自定义输出逻辑。
  2. debugPrint回调中根据日志级别或关键词过滤。
  3. 使用第三方库如logger,支持按级别过滤和自定义输出格式。

更多关于flutter如何实现日志过滤的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现日志过滤可以通过以下几种方式:

1. 使用debugPrint函数

void customDebugPrint(String message, {bool showLog = true}) {
  if (showLog) {
    debugPrint(message);
  }
}

// 使用示例
customDebugPrint('重要日志', showLog: true);
customDebugPrint('调试日志', showLog: false); // 这条不会输出

2. 自定义日志类

class Logger {
  static const List<String> _enabledTags = ['NETWORK', 'ERROR', 'IMPORTANT'];
  
  static void log(String tag, String message) {
    if (_enabledTags.contains(tag)) {
      debugPrint('[$tag] $message');
    }
  }
  
  // 动态启用/禁用标签
  static void enableTag(String tag) {
    if (!_enabledTags.contains(tag)) {
      _enabledTags.add(tag);
    }
  }
  
  static void disableTag(String tag) {
    _enabledTags.remove(tag);
  }
}

// 使用示例
Logger.log('NETWORK', 'API调用开始');
Logger.log('DEBUG', '这条不会输出'); // DEBUG标签不在启用列表中

3. 使用日志级别

enum LogLevel { VERBOSE, DEBUG, INFO, WARNING, ERROR }

class LevelLogger {
  static LogLevel currentLevel = LogLevel.INFO;
  
  static void log(LogLevel level, String message) {
    if (level.index >= currentLevel.index) {
      debugPrint('${level.toString().split('.').last}: $message');
    }
  }
}

// 使用示例
LevelLogger.currentLevel = LogLevel.WARNING;
LevelLogger.log(LogLevel.DEBUG, '调试信息'); // 不会输出
LevelLogger.log(LogLevel.ERROR, '错误信息'); // 会输出

4. 使用第三方库

推荐使用 logger 包:

dependencies:
  logger: ^2.0.0
import 'package:logger/logger.dart';

var logger = Logger(
  filter: DevelopmentFilter(), // 生产环境可以替换为ProductionFilter
  printer: PrettyPrinter(),
  output: ConsoleOutput(),
);

// 使用不同级别
logger.v('Verbose日志');
logger.d('Debug日志');
logger.i('Info日志');
logger.w('Warning日志');
logger.e('Error日志');

5. 环境相关的过滤

class EnvironmentLogger {
  static bool get isDebug => bool.fromEnvironment('dart.vm.product');
  
  static void log(String message) {
    if (!isDebug) return; // 只在调试模式输出
    
    debugPrint(message);
  }
}

选择哪种方式取决于你的具体需求:

  • 简单过滤:使用debugPrint包装
  • 标签过滤:自定义Logger类
  • 级别控制:使用日志级别枚举
  • 完整功能:使用第三方logger包
回到顶部