Flutter每日库: logger自定义日志格式并输出到文件

在Flutter开发中,日志记录是调试和分析问题的重要工具。虽然系统自带print()debugPrint(),但功能单一、缺乏灵活性。今天为大家推荐一款高效、美观且可扩展的日志库------Logger,支持多级日志、自定义输出格式,甚至能将日志写入文件!

一、安装

复制代码
 flutter pub add logger

二、核心功能:自定义日志格式并写入文件

1. 自定义文件输出类

通过继承LogOutput,实现将日志按时间格式写入文件的功能。以下代码展示了如何创建FileLogOutput

dart 复制代码
// 自定义日志输出到文件格式
import 'dart:io';

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

class FileLogOutput extends LogOutput {

  late Directory _targetDir;

  @override
  Future<void> init() async {
    _targetDir = await getApplicationDocumentsDirectory();
    debugPrint("_targetDir = $_targetDir");
    return super.init();
  }

  @override
  void output(OutputEvent event) async {

    final DateTime currentDate = DateTime.now();
    final String dateString =
        "${currentDate.day}-${currentDate.month}-${currentDate.year}";

    final File file = File('${_targetDir.path}/log.log');
    if (!(await file.exists())) {
      await file.create(recursive: true);
    }

    file.writeAsStringSync(
      "[$dateString | ${currentDate.hour}:${currentDate.minute}:${currentDate.second}] ${event.origin.message}\n",
      mode: FileMode.append,
    );
  }
}

2. 多输出源核心配置

dart 复制代码
 final logger = Logger(
    output: MultiOutput([ConsoleOutput(), FileLogOutput()]),
  );

3. 使用案例

dart 复制代码
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';

import 'file_log_output.dart';

class LogPage extends StatefulWidget {
  const LogPage({super.key});

  @override
  State<LogPage> createState() => _LogPageState();
}

class _LogPageState extends State<LogPage> {
  
  // 同时输出到控制台和日志文件
  final logger = Logger(
    output: MultiOutput([ConsoleOutput(), FileLogOutput()]),
  );

  final pickList = [
    "Pick an image",
    "Capture a photo",
    "Pick a video",
    "Capture a video",
    "Pick multiple images",
    "Pick singe image or video",
    "Pick multiple images and videos",
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('LogPage'), elevation: 4),
      backgroundColor: Colors.white,
      body: Column(
        children: [
          TextButton(
            onPressed: () {
              // 输出示例
              logger.t("Trace log");
              logger.i("Debug log");
              logger.i(pickList);
              logger.i("Info log");
            },
            child: Text("log print"),
          ),
        ],
      ),
    );
  }
}

该库自带的输出类型介绍

  • ConsoleOutput:默认控制台输出

  • AdvancedFileOutput:支持日志文件滚动管理(如按日期分割)

  • MemoryOutput:将日志暂存于内存,适合短期调试

  • MultiOutput:多输出源组合

  • StreamOutput:结合Stream实现动态日志流处理

相关推荐
Patrick_Wilson12 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
奎叔14 小时前
Flutter 分层架构:从页面堆叠到可演进的业务边界
flutter
奎叔15 小时前
Flutter 客户端 Trace 与稳定性治理:从链路追踪到灰度、降级和复盘
flutter
GitLqr17 小时前
别被“Flutter 传感器延迟 150ms”带偏了:这可能只是你的实现方式错了
flutter·架构·kotlin
杉氧19 小时前
Flutter 像素级还原实战:用 CustomPaint 与 Bezier 曲线手绘精致图针
android·前端·flutter
山璞2 天前
将一个 Flutter 项目转为用 ArkUI-X 框架实现(4)
flutter·harmonyos
GitLqr2 天前
彻底搞懂 Dart Stream:从底层原理到 Flutter 实战与面试题集
flutter·响应式编程·dart
louisgeek2 天前
Flutter Visibility 和 Offstage 的区别
flutter
YM52e2 天前
鸿蒙Flutter Padding内边距:EdgeInsets详解
android·学习·flutter·华为·harmonyos·鸿蒙
SharpCJ2 天前
Dart 基础入门
flutter·dart