手把手带你写flutter:2、日志框架(上)

132 阅读2分钟

1. logger 库

GitHub: github.com/simc/logger

1.1 核心特性

  • 彩色输出

  • 自定义打印器

  • 错误堆栈跟踪

  • 方法调用跟踪

  • JSON 格式化

1.2 架构设计

Logger
  ├── LogPrinter (输出格式化)
  ├── LogOutput (输出目标)
  └── LogFilter (日志过滤)

1.3 关键实现

class Logger {
  final LogFilter? filter;
  final LogPrinter printer;
  final LogOutput output;
  
  void log(Level level, message, [error, StackTrace? stackTrace]) {
    final event = LogEvent(level, message, error, stackTrace);
    if (filter?.shouldLog(event) ?? true) {
      List<String> lines = printer.log(event);
      output.output(OutputEvent(level, lines));
    }
  }
}

2. logging 库 (Dart 官方)

pub.dev: pub.dev/packages/lo…

2.1 核心特性

  • 分层日志记录

  • 层级结构

  • 灵活的处理器

  • 简单易用

2.2 架构设计

Logger (层级式)
  ├── LogRecord (日志记录)
  └── Level (日志级别)

2.3 关键实现

class Logger {
  final String name;
  final Map<String, Logger> _children;
  final Logger? parent;
  
  void log(Level level, message, [Object? error]) {
    if (isLoggable(level)) {
      var record = LogRecord(level, message, name, error);
      Function? handler = recordHandler;
      if (handler != null) handler(record);
    }
  }
}

3. talker

GitHub: github.com/Frezyx/talk…

3.1 核心特性

  • UI 界面展示

  • 网络日志

  • 错误处理

  • 自定义格式

  • 文件存储

3.2 架构设计

Talker
  ├── TalkerLogger (日志记录)
  ├── TalkerObserver (观察者)
  ├── TalkerFilter (过滤器)
  └── TalkerDataInterface (数据接口)

3.3 关键实现

class Talker {
  final List<TalkerObserver> observers;
  final TalkerDataInterface dataInterface;
  
  void handle(TalkerData data) {
    for (final observer in observers) {
      observer.handle(data);
    }
    dataInterface.save(data);
  }
}

4. l

pub.dev: pub.dev/packages/l

4.1 核心特性

  • 极简设计

  • 链式调用

  • 自定义标签

  • 性能优化

4.2 架构设计

L
  └── LogMessage

4.3 关键实现

class L {
  static void log(
    dynamic message, {
    String? tag,
    StackTrace? stackTrace,
  }) {
    print('$tag: $message');
    if (stackTrace != null) print(stackTrace);
  }
}

5. 框架对比分析

5.1 功能对比

功能loggerloggingtalker l
彩色输出 × ✓×
文件存储×× ✓×
UI展示× ××
自定义格式 ✓ ×
错误追踪 ✓ ✓
性能中 

5.2 优缺点分析

logger

优点:

  • 输出格式美观

  • 配置灵活

  • 社区活跃

缺点:

  • 性能开销较大

  • 缺少文件存储

  • 配置较复杂

logging

优点:

  • 官方支持

  • 性能优秀

  • 设计简洁

缺点:

  • 功能较简单

  • 缺少可视化

  • 配置有限

talker

优点:

  • 功能全面

  • UI界面支持

  • 扩展性强

缺点:

  • 学习曲线陡

  • 依赖较多

  • 体积较大

l

优点:

  • 极简设计

  • 性能最优

  • 使用简单

缺点:

  • 功能有限

  • 扩展性差

  • 定制性低

6. 预告:手把手实现一个日志框架

6.1 理由:网络请求打印不完整