Flutter日志管理插件logecom的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter日志管理插件logecom的使用

Logecom介绍

Logecom 是一个简单但强大的基于中间件的日志工具,灵感来源于 Node.js Express 库。它提供了一个抽象的日志处理过程,并定义了一个简单的且功能丰富的接口,以最小化开销并提供一个栈来实现任何具有所需功能的日志流水线。

基本接口包括:

  • LogTranslator

通过不同的方式实现 LogTranslator,可以达到任何结果。你可以转换、格式化、收集、打印或发送日志,甚至使用另一个日志器!一切都可以在单个地方实现。

特性

Logecom 提供了几个“现成”的 LogTranslator 实现,覆盖了最常见的日志用例:

  • HttpFormatter - 用于轻松记录 HTTP 交互
  • ConsoleTransport - 默认控制台打印机。提供简单的且紧凑的日志条目格式化方法,可以通过 stdoutstderrdeveloper.log()print() 方法进行打印

开始使用

要开始使用 Logecom 日志器,首先需要配置所需的流水线。 默认情况下没有配置。通常除了简单的文本事件外,你可能还需要找到和格式化 HTTP 日志条目,并捕获所有未处理的错误。

对于 Flutter 应用程序,配置可能如下:

void main() {
  final method = PrintingMethod.stdErr;

  // 典型的日志流水线
  Logecom.instance.pipeline = [
    HttpFormatter(
      printRpcContent: config.logPrintRpcContent,
      hideAuthData: config.logHideAuthData,
      colorize: method == PrintingMethod.stdErr || method == PrintingMethod.stdOut,
    ),
    ConsoleTransport(
      config: ConsoleTransportConfig(
        printingMethod: method,
        timestampFormat: method == PrintingMethod.print ? '' : 'yyyy-mm-dd HH:MM:ss.S',
      ),
    ),
  ];

  // 这个 logger 用于指定未分类(全局)事件
  final logger = Logecom.createLogger('Global');

  FlutterError.onError = (FlutterErrorDetails details) {
    logger.error('Flutter Error', [details.exception, details.stack]);
  };

  void onUnhandledException(Object error, StackTrace stack) {
    logger.error('Unhandled Exception', [error, '\n$stack']);
  }

  Isolate.current.addErrorListener(RawReceivePort((List<dynamic> pair) async {
    final error = pair.first;
    final StackTrace stack = pair.last;
    logger.error('Unhandled Isolate Error', [error, '\n$stack']);
  }).sendPort);

  /// 所有应用程序代码必须在这个函数内
  /// 以正确处理所有错误
  void bootstrap() {
    // [AppView] 是你的应用程序入口组件
    runApp(AppView());
  }

  runZonedGuarded(bootstrap, onUnhandledException);  
}

使用

要使用常见的日志 API,你需要创建一个带有特定类别的特定 Logger 实例,类别通常表示事件源。一个好的实践是使用当前类或包名作为此目的。

class AppViewState extends State<AppView> {
  // 可以传递类类型或任何所需的字符串
  final logger = Logecom.createLogger(AppView);

  @override
  void initState() {
    super.initState();
    // 使用 logger 实例来记录事件
    logger.log('State initialized');
  }
}

使用默认的 ConsoleTransport,上述代码将打印以下内容:

2021-06-19 22:12:43.326 [LOG] AppView State initialized

注意: 如果你没有看到任何日志: 检查是否设置了正确的 printingMethodConsoleTransportConfig。 不是所有打印方法都适用于所有环境。 例如,如果你为运行在 iPhone 模拟器中的 Flutter 应用程序设置 PrintingMethod.stdErr,则不会看到任何日志!这是一个已知的问题。请参阅 PrintingMethod 内部文档获取更多信息。

记录 Dio HTTP 请求

Dio 是一个流行的 HTTP 客户端库,可以在 pub.dev 上找到。要记录其请求,可以使用 Interceptor 实现如下:

import 'package:dio/dio.dart';
import 'package:logecom/logecom.dart';

class DioLogInterceptor extends Interceptor {
  DioLogInterceptor(this._logger);

  final Logger _logger;
  final _requestStartTime = Map<RequestOptions, DateTime>();

  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    _requestStartTime[options] = DateTime.now();
    handler.next(options);
  }

  @override
  void onError(DioError err, ErrorInterceptorHandler handler) {
    final startTime = _requestStartTime[err.requestOptions] ?? DateTime.now();
    _requestStartTime.remove(err.requestOptions);
    _logger.log(
      'HTTP',
      HttpLogContext(
        method: err.requestOptions.method,
        url: err.requestOptions.uri,
        statusCode: err.response?.statusCode ?? -1,
        statusMessage: err.response?.statusMessage ?? err.message,
        duration: DateTime.now().difference(startTime),
        responseData: err.response?.data,
        requestData: err.response?.requestOptions.data,
        headers: _getHeaders(err.requestOptions.headers),
      ),
    );
    handler.next(err);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    final startTime = _requestStartTime[response.requestOptions] ?? DateTime.now();
    _requestStartTime.remove(response.requestOptions);
    _logger.log(
      'HTTP',
      HttpLogContext(
        method: response.requestOptions.method,
        url: response.requestOptions.uri,
        statusCode: response.statusCode ?? 0,
        statusMessage: response.statusMessage ?? '',
        duration: DateTime.now().difference(startTime),
        responseData: response.data,
        requestData: response.requestOptions.data,
        headers: _getHeaders(response.requestOptions.headers),
      ),
    );
    handler.next(response);
  }

  Map<String, String> _getHeaders(Map<String, dynamic> headers) {
    return headers.map((key, value) {
      if (value is String) {
        return MapEntry(key, value);
      } else if (value is List) {
        return MapEntry(key, value.join('; '));
      } else {
        return MapEntry(key, value.toString());
      }
    });
  }
}

使用示例如下:

class AuthService {
  AuthService() {
   client.interceptors.addAll([
     DioLogInterceptor(logger),
   ]);
  }

  final logger = Logecom.createLogger(AuthService);
  final client = Dio();
  ...
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用logecom插件进行日志管理的代码示例。logecom是一个用于日志管理的Flutter插件,它允许你在应用中轻松地记录、管理和输出日志。

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

dependencies:
  flutter:
    sdk: flutter
  logecom: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,你可以在你的Flutter应用中初始化并使用logecom进行日志记录。以下是一个完整的示例:

1. 初始化logecom

在你的应用入口文件(通常是main.dart)中,初始化logecom

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

void main() {
  // 初始化logecom
  Logecom.init(
    level: LogLevel.verbose, // 设置日志级别
    saveToFile: true, // 是否将日志保存到文件
    filePath: '/path/to/your/logfile.log', // 日志文件路径(在Android上可以使用内部存储路径)
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

2. 使用logecom记录日志

在应用的任意位置使用Logecom的方法记录日志:

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    // 记录日志示例
    Logecom.v('这是一个 Verbose 日志');
    Logecom.d('这是一个 Debug 日志');
    Logecom.i('这是一个 Info 日志');
    Logecom.w('这是一个 Warning 日志');
    Logecom.e('这是一个 Error 日志');

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Logecom 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '点击按钮记录日志',
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 在按钮点击时记录一个自定义日志
                Logecom.i('按钮被点击了');
              },
              child: Text('记录日志'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 查看日志

  • 控制台输出:在开发过程中,日志会输出到控制台,你可以通过运行flutter run来查看。
  • 日志文件:如果你设置了saveToFile: true,日志还会被保存到指定的文件路径中。在Android设备上,你可能需要使用ADB工具将日志文件从设备中导出到本地查看。

注意事项

  • 确保你指定的日志文件路径在设备上是有写权限的。
  • 在iOS上,你可能需要在Info.plist中添加相应的文件访问权限。
  • 在生产环境中,建议将日志级别设置为较高的级别(如LogLevel.error),以减少日志量和避免敏感信息泄露。

这个示例展示了如何在Flutter应用中使用logecom插件进行日志管理。你可以根据自己的需求进一步配置和使用这个插件。

回到顶部