Flutter结构化日志记录插件structured_logger的使用

Flutter结构化日志记录插件structured_logger的使用

Structured Logs

structured_logger

Description

structured_logger 包为您的 Flutter 应用程序提供了轻松实现结构化日志的方法。它通过称为 Sinks 的接口允许将日志发送到不同的目的地,例如终端或外部服务。该包包含一个示例 Sink,SimpleLineSink,用于将日志发送到终端。

Installation

在您的 pubspec.yaml 文件中添加以下内容:

structured_logger: ^current_version

Basic Usage

首先,在您的 Dart 文件中导入包:

import 'package:structured_logger/structured_logger.dart';

然后创建一个日志记录器实例:

final logger = StructureLogger();

接下来,添加一个 Sink 来指定日志应该发送到哪里。例如,要将日志发送到终端,可以使用 SimpleLineSink:

LogSink sink = SimpleLineSink();
logger.addSink(sink);

如果需要,还可以添加其他 Sink,以便将日志发送到不同的目的地:

LogSink defaultlog = DefaultSink();
logger.addSink(defaultlog);

最后,使用 log 方法注册日志:

await logger.log(
  "Welcome {name}, your level is {level}",
  level: LogLevel.info,
  data: {"name": "John Doe", "level": 12},
);

终端输出 [第一行由 SimpleLineSink 写入,第二行由 DefaultSink 写入]:

Seja bem vindo John Doe, seu nível é 12
[log] {[@t](/user/t): 2023-12-19T15:38:06.563023, [@mt](/user/mt): Seja bem vindo {name}, seu nível é {level}, [@l](/user/l): info, data: {name: John Doe, level: 12}}

第一行是由 SimpleLineSink 写入的,第二行是由 DefaultSink 写入的。

这是一个简单的示例,您可以根据需要自定义 Sink 和日志数据。例如,您可以创建一个将日志发送到外部服务(如 Seq 或 Elastic)的 Sink。(或者使用另一个已经完成此功能的包,如 (WIP)。)


完整示例代码

以下是完整的代码示例,展示了如何使用 structured_logger 插件进行结构化日志记录:

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

void main() async {
  // 初始化结构化日志记录器
  final logger = StructureLogger();

  // 添加一个 Sink,将日志发送到终端
  LogSink terminalSink = SimpleLineSink();
  logger.addSink(terminalSink);

  // 添加另一个 Sink,将日志发送到默认目的地
  LogSink defaultSink = DefaultSink();
  logger.addSink(defaultSink);

  // 记录一条信息级别的日志
  await logger.log(
    "Welcome {name}, your level is {level}",
    level: LogLevel.info,
    data: {"name": "John Doe", "level": 12},
  );

  // 启动 Flutter 应用程序
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('structured_logger 示例')),
        body: Center(child: Text('检查终端输出!')),
      ),
    );
  }
}

运行此代码后,您将在终端中看到类似以下的日志输出:

Seja bem vindo John Doe, seu nível é 12
[log] {[@t](/user/t): 2023-12-19T15:38:06.563023, [@mt](/user/mt): Welcome {name}, your level is {level}, [@l](/user/l): info, data: {name: John Doe, level: 12}}

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

1 回复

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


structured_logger 是一个用于 Flutter 的结构化日志记录插件,它可以帮助开发者以结构化的方式记录日志,便于后续的日志分析和处理。以下是使用 structured_logger 的基本步骤和示例。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 structured_logger 依赖:

dependencies:
  flutter:
    sdk: flutter
  structured_logger: ^1.0.0  # 请查看最新版本

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

2. 初始化 Logger

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

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

void main() {
  // 初始化 Logger
  Logger.initialize(
    logLevel: LogLevel.info,  // 设置日志级别
    formatter: JsonFormatter(),  // 使用 JSON 格式化日志
    outputs: [
      ConsoleOutput(),  // 输出到控制台
      // 你可以添加其他输出,如文件输出、远程日志服务等
    ],
  );

  runApp(MyApp());
}

3. 记录日志

在你的代码中使用 Logger 来记录日志:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 记录不同级别的日志
    Logger.debug('This is a debug message');
    Logger.info('This is an info message');
    Logger.warning('This is a warning message');
    Logger.error('This is an error message', error: 'Some error occurred');

    return MaterialApp(
      title: 'Structured Logger Example',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Structured Logger Example'),
        ),
        body: Center(
          child: Text('Check the console for structured logs!'),
        ),
      ),
    );
  }
}

4. 自定义日志格式和输出

structured_logger 允许你自定义日志的格式和输出方式。例如,你可以使用 JsonFormatter 将日志格式化为 JSON,或者使用 ConsoleOutput 将日志输出到控制台。

你还可以添加其他输出,例如将日志写入文件或发送到远程日志服务:

void main() {
  Logger.initialize(
    logLevel: LogLevel.info,
    formatter: JsonFormatter(),
    outputs: [
      ConsoleOutput(),
      FileOutput('app.log'),  // 输出到文件
      // RemoteOutput('https://your-log-service.com/logs'),  // 输出到远程服务
    ],
  );

  runApp(MyApp());
}

5. 日志级别

Logger 支持不同的日志级别,包括 debuginfowarningerror。你可以通过设置 logLevel 来控制哪些级别的日志会被记录。

Logger.initialize(
  logLevel: LogLevel.warning,  // 只记录 warning 和 error 级别的日志
  formatter: JsonFormatter(),
  outputs: [ConsoleOutput()],
);

6. 添加额外的日志信息

你可以通过 Loggerlog 方法添加额外的结构化信息:

Logger.log(
  level: LogLevel.info,
  message: 'User logged in',
  data: {'userId': 123, 'username': 'john_doe'},
);

7. 捕获异常

你还可以使用 Logger 来捕获并记录异常:

try {
  // 一些可能抛出异常的代码
} catch (e, stackTrace) {
  Logger.error('An error occurred', error: e, stackTrace: stackTrace);
}

8. 自定义输出

你可以通过实现 LogOutput 接口来创建自定义的输出方式。例如,将日志发送到远程服务:

class RemoteOutput implements LogOutput {
  final String url;

  RemoteOutput(this.url);

  @override
  void output(LogEntry entry) {
    // 发送日志到远程服务
    // 使用 http 或 dio 等库发送 HTTP 请求
  }
}

然后在初始化时添加这个自定义输出:

Logger.initialize(
  logLevel: LogLevel.info,
  formatter: JsonFormatter(),
  outputs: [
    ConsoleOutput(),
    RemoteOutput('https://your-log-service.com/logs'),
  ],
);
回到顶部