Flutter日志记录插件tw_logger的使用

Flutter日志记录插件tw_logger的使用

简介

特性

  • 支持通用日志输出功能,并将日志内容写入数据库。
  • 支持网络请求拦截输出功能,将请求和响应结果写入数据库。
  • 支持异常捕获功能,并将错误写入数据库。
  • 实现了UI界面的添加、删除和标签查询记录。

开始使用

在你的 pubspec.yaml 文件中添加 tw_logger

dependencies:
  tw_logger: latest_version

使用方法

在需要用到 tw_logger 的文件中导入它:

import 'package:tw_logger/tw_logger.dart';

示例代码

import 'dart:async';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:tw_logger/tw_logger.dart';

// 引入Dio库用于网络请求
// ignore: depend_on_referenced_packages
import 'package:dio/dio.dart';

void main(List<String> args) async {
  // 捕捉Flutter框架错误
  FlutterError.onError = (FlutterErrorDetails details) {
    TWCrashHelper.handleCrashCache(details);
  };
  // 运行时捕获错误并处理
  runZonedGuarded(
    () {
      runApp(const MyApp());
    },
    (error, stacktrace) {
      TWCrashHelper.handleCrashCache(FlutterErrorDetails(
        stack: stacktrace,
        exception: error,
      ));
    },
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 应用程序根组件
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'tw_logger',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(
          seedColor: Colors.deepPurple,
        ),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'tw_logger'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final dio = Dio();
  late OverlayEntry overlayEntry;

  [@override](/user/override)
  void initState() {
    super.initState();
    setUp();
    setLoggerFilter();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Switch(
              value: TWLoggerConfigure().open,
              onChanged: switchOpenChanged,
            ),
            FilledButton(
              onPressed: () {
                log();
              },
              child: const Text('log'),
            ),
            FilledButton(
              onPressed: () {
                log2();
              },
              child: const Text('log2'),
            ),
            FilledButton(
              onPressed: () {
                log3();
              },
              child: const Text('log3'),
            ),
            FilledButton(
              onPressed: () {
                throw Exception('This is a crash test');
              },
              child: const Text('throw error'),
            ),
            FilledButton(
              onPressed: () {
                get1();
              },
              child: const Text('get1'),
            ),
            FilledButton(
              onPressed: () {
                get2();
              },
              child: const Text('get2'),
            ),
            FilledButton(
              onPressed: () {
                delete();
              },
              child: const Text('delete'),
            ),
            FilledButton(
              onPressed: () {
                post();
              },
              child: const Text('post'),
            ),
          ],
        ),
      ),
    );
  }

  void setLoggerFilter() {
    TWLogger().filter = (
      level,
      message,
      error,
      stackTrace,
      time,
    ) {
      // 过滤特定的日志信息
      return message != 'filter log';
    };
  }

  void setUp() {
    if (TWLoggerConfigure().open) {
      overlayEntry = TWLoggerOverlay.attachTo(context);
    } else {
      overlayEntry.remove();
    }
    TWNetworkSetting.updateInterceptor(dio);
  }

  void switchOpenChanged(bool value) {
    setState(() {
      TWLoggerConfigure().isEnabled = value;
      setUp();
    });
  }

  void log() {
    String randomString = generateRandomString(120);
    TWLogger.log(randomString);
  }

  void log2() {
    String randomString = generateRandomString(120);
    TWLogger.log(
      randomString,
      level: TWLogLevel.error,
    );
  }

  void log3() {
    TWLogger.log('filter log');
  }

  String generateRandomString(int length) {
    const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    Random random = Random();
    return List.generate(
            length, (index) => characters[random.nextInt(characters.length)])
        .join();
  }

  void get1() {
    dio.get('https://flutter.dev/');
  }

  void get2() {
    dio.get('https://jsonplaceholder.typicode.com/todos');
  }

  void delete() {
    dio.delete(
        'http://ajax.googleapis.com/ajax/services/feed/load?q=FeedName&v=1.0');
  }

  void post() {
    dio.post(
      'https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15',
      data: {
        "id": 1,
        "title": "Hello World",
        "content": "This is a post"
      },
    );
  }
}

更多关于Flutter日志记录插件tw_logger的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日志记录插件tw_logger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用tw_logger插件来进行日志记录的示例代码。tw_logger是一个用于Flutter的日志记录库,它允许你以不同的日志级别(如debug、info、warn、error)来记录日志,并且支持将日志输出到控制台以及文件。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加tw_logger的依赖:

dependencies:
  flutter:
    sdk: flutter
  tw_logger: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 初始化Logger

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Logger并配置日志输出:

import 'package:flutter/material.dart';
import 'package:tw_logger/tw_logger.dart';

void main() {
  // 初始化Logger
  Logger.init(
    level: LogLevel.debug,  // 设置日志级别
    output: [
      LogOutput.console(),  // 输出到控制台
      LogOutput.file(
        path: 'logs/',  // 日志文件存储路径
        fileName: 'app.log',  // 日志文件名
        maxFileSize: 10 * 1024 * 1024,  // 最大文件大小(10MB)
        maxFileCount: 5  // 最大文件数量
      )
    ]
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Log Example'),
        ),
        body: Center(
          child: MyLogWidget(),
        ),
      ),
    );
  }
}

class MyLogWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 示例日志记录
    Logger.debug('This is a debug message');
    Logger.info('This is an info message');
    Logger.warn('This is a warning message');
    Logger.error('This is an error message');

    return Text('Check your console and logs directory for log messages.');
  }
}

3. 使用Logger

现在,你可以在你的应用中的任何地方使用Logger来记录日志。例如:

void someFunction() {
  Logger.debug('Function started');
  try {
    // 一些代码逻辑
    if (someCondition) {
      Logger.warn('Some condition is met, this might be a warning');
    }
  } catch (e, stackTrace) {
    Logger.error('An error occurred', e, stackTrace);
  }
  Logger.debug('Function ended');
}

4. 查看日志

  • 控制台日志:当你运行Flutter应用时,日志将自动输出到控制台。
  • 文件日志:日志文件将保存在你指定的路径下(在这个例子中是logs/app.log)。你可以使用设备上的文件管理器或者通过连接设备到开发机器上来查看这些日志文件。

注意事项

  • 确保你有写入日志文件的权限。
  • 在生产环境中,你可能希望调整日志级别和输出配置,以避免记录过多的调试信息或占用过多的存储空间。
  • 考虑到性能和隐私,不要在敏感或高频调用的代码路径中记录过多的日志。

以上是一个简单的示例,展示了如何在Flutter项目中使用tw_logger插件进行日志记录。根据你的具体需求,你可以进一步配置和扩展日志记录的功能。

回到顶部