You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart带参数单例实现:全局应用Logger日志实例的正确配置方式

实现方案

方案1:顶层全局变量(推荐最简单场景)

Dart 中的顶层变量默认是懒加载的,只会在首次被引用时完成初始化,完全满足你仅实例化一次 Logger 和 PrettyPrinter 的需求,实现成本最低:

  1. 新建单独的工具文件例如 lib/utils/logger.dart,写入如下代码:
import 'package:logger/logger.dart';

final logger = Logger(
  printer: PrettyPrinter(
    methodCount: 2,
    colors: true,
  ),
);
  1. 其他业务文件只要导入这个 logger.dart 就可以直接全局共用同一个 logger 实例:
import 'package:你的项目名/utils/logger.dart';

// 使用示例
logger.d("调试日志");
logger.e("错误日志", error: e, stackTrace: stackTrace);

方案2:单例类封装(适合需要扩展日志能力的场景)

如果你后续需要给日志增加额外逻辑(比如日志上报、不同环境动态调整日志级别、自定义过滤规则),可以封装为单例类:

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

class AppLogger {
  // 单例实例
  static final AppLogger _instance = AppLogger._internal();
  // 内部Logger实例
  final Logger _logger;

  // 工厂构造返回单例
  factory AppLogger() => _instance;

  // 私有构造,禁止外部实例化
  AppLogger._internal() : _logger = Logger(
    printer: PrettyPrinter(
      methodCount: 2,
      colors: true,
    ),
    // 可选配置:release环境关闭日志输出
    level: kReleaseMode ? Level.off : Level.debug,
  );

  // 封装常用日志方法
  void debug(String message) => _logger.d(message);
  void info(String message) => _logger.i(message);
  void warning(String message) => _logger.w(message);
  void error(String message, {dynamic error, StackTrace? stackTrace}) => _logger.e(message, error: error, stackTrace: stackTrace);
}

使用方式:

// 任意位置调用,始终获取同一个实例
AppLogger().debug("调试信息");
AppLogger().error("请求失败", error: err, stackTrace: stack);

选型建议

  • 仅需要统一日志格式、无额外扩展需求,直接用顶层全局变量即可,足够简洁高效
  • 需要自定义日志逻辑、后续要迭代日志能力,选择单例类封装更易维护

内容的提问来源于stack exchange,提问作者Mr. Oak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:15:05