Flutter日志记录插件seq_logger的使用

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

Flutter日志记录插件seq_logger的使用

1: seq_logger

seq_logger 是一个与 seq 兼容的日志记录插件,适用于 Flutter 应用。更多关于 seq 的信息,请访问:https://datalust.co/seq

在 Flutter 中使用该插件:

flutter pub add seq_logger

这将会在你的项目的 pubspec.yaml 文件中添加一行类似的内容,并运行隐式 flutter pub get

dependencies:
  seq_logger: ^1.0.8

或者,如果你的编辑器支持 flutter pub get,可以检查编辑器文档以了解更多信息。

如何使用

查看工作示例 here

初始化包在主函数中的任何地方,在调用 runApp 之前进行初始化。

void main() {
  if (!SeqLogger.initialized) {
    SeqLogger.init(
      url: "YOUR_API_ENDPOINT_URL_HERE",
      apiKey: "YOUR_API_KEY",
    );
  }

  runApp(const MyApp());
}

每当需要时添加日志。你可以使用模板在消息字符串中,并在数据字段中提供值。 你的日志将在设备上收集。

SeqLogger.addLogToDb(
   message: "Your log message here with {Awesome} template",
   level: LogLevel.debug,
   data: {
     "Awesome": "the value that will highlighted in your template",
     "yourKey": "Your value",
     "yourOtherKey": false,
   },
);

触发发送收集的日志。进程将根据您的批次大小参数发送收集的日志。

SeqLogger.sendLogs();

获取数据库中存储的日志数量。

int count = await SeqLogger.getRecordCount();

示例代码

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

void main() {
  if (!SeqLogger.initialized) {
    SeqLogger.init(
      url: 'your_seq_url_here',
      apiKey: "YOUR_APIKEY_HERE",
      batchSize: 50,
    );
  }
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomeScreen(),
    );
  }
}

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

  [@override](/user/override)
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  late TextEditingController messageController;
  late TextEditingController dataController;
  LogLevel selectedLogLevel = LogLevel.debug;
  String logUsageText = "";
  bool dataError = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    messageController = TextEditingController();
    dataController = TextEditingController();
  }

  [@override](/user/override)
  void dispose() {
    messageController.dispose();
    dataController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      appBar: AppBar(
        actions: [
          IconButton(
            icon: const Icon(Icons.send),
            onPressed: () => SeqLogger.sendLogs(),
          )
        ],
      ),
      body: SingleChildScrollView(
        padding: const EdgeInsets.symmetric(horizontal: 116, vertical: 8),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              controller: messageController,
              maxLines: 1,
              onChanged: (value) => populateSampleData(),
              decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: "Your Message Template",
                  hintText: "my foo value is {foo} and {mySample}"),
            ),
            DropdownButton<LogLevel>(
              value: selectedLogLevel,
              items: const [
                DropdownMenuItem<LogLevel>(
                    value: LogLevel.info, child: Text("info")),
                DropdownMenuItem<LogLevel>(
                    value: LogLevel.warning, child: Text("warning")),
                DropdownMenuItem<LogLevel>(
                    value: LogLevel.debug, child: Text("debug")),
                DropdownMenuItem<LogLevel>(
                    value: LogLevel.error, child: Text("error")),
                DropdownMenuItem<LogLevel>(
                    value: LogLevel.verbose, child: Text("verbose")),
              ],
              onChanged: (LogLevel? v) {
                if (v != null) {
                  setState(() => selectedLogLevel = v);
                }
                populateSampleData();
              },
            ),
            TextField(
              controller: dataController,
              minLines: 5,
              maxLines: 10,
              onChanged: (value) => populateSampleData(),
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                labelText: "Log Map Data",
                hintText: '''
{
  "foo": "bar",
  "mySample": true,
}
                ''',
              ),
            ),
            const Divider(),
            const Text("Usage"),
            Text(dataError
                ? "Cannot parse 'Log Map Data' as Map"
                : logUsageText),
            ElevatedButton(
                onPressed: dataError
                    ? null
                    : () {
                        SeqLogger.addLogToDb(
                            message: messageController.text,
                            level: selectedLogLevel,
                            data: dataController.text.isEmpty
                                ? null
                                : json.decode(dataController.text));
                      },
                child: const Text("Add Log")),
            const Divider(),
            ElevatedButton(
                onPressed: () {
                  SeqLogger.addLogToDb(
                    message: "APP my foo is {foo}, my boolean is {b}",
                    data: {
                      "foo": "bar",
                      "b": true,
                      "additional": [
                        {"complexObject": 1},
                        {"complexObject": 2, "hello": "world"},
                      ]
                    },
                    level: LogLevel.info,
                  );
                },
                child: const Text("Add a Random Log"))
          ],
        ),
      ),
    );
  }

  void populateSampleData() {
    if (messageController.text.isNotEmpty) {
      if (dataController.text.isEmpty) {
        setState(() => dataError = false);
        setState(() {
          logUsageText = '''
SeqLogger.addLogToDb(
  message: "${messageController.text}",
  level: $selectedLogLevel,
);
              ''';
        });
      } else {
        try {
          Map<String, dynamic> dataMap = json.decode(dataController.text);

          setState(() => dataError = false);
          setState(() {
            logUsageText = '''
SeqLogger.addLogToDb(
  message: "${messageController.text}",
  level: $selectedLogLevel,
  data: ${json.encode(dataMap)}
);
              ''';
          });
        } catch (ex) {
          setState(() => dataError = true);
        }
      }
    } else {
      setState(() {
        logUsageText = '';
      });
    }
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用seq_logger插件进行日志记录的示例代码。seq_logger是一个Flutter插件,它允许你将日志发送到Seq(一个开源的日志服务器)。

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

dependencies:
  flutter:
    sdk: flutter
  seq_logger: ^x.y.z  # 请将x.y.z替换为当前最新版本号

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

接下来,你可以按照以下步骤配置和使用seq_logger

1. 配置Seq Logger

在你的Flutter应用的主文件(通常是main.dart)中,配置SeqLogger

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

void main() {
  // 配置Seq Logger
  configureSeqLogger(
    serverUrl: 'http://your-seq-server-url:5341', // 替换为你的Seq服务器URL
    apiKey: 'your-api-key', // 如果你的Seq服务器需要API密钥
    level: LogLevel.debug, // 设置日志级别
  );

  runApp(MyApp());
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    // 记录一些日志
    log.info('This is an info log');
    log.debug('This is a debug log');
    log.warning('This is a warning log');
    log.error('This is an error log');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Check your Seq server for logs'),
      ),
    );
  }
}

2. 使用Seq Logger记录日志

在上面的代码中,我们在_MyHomePageStateinitState方法中记录了几种不同级别的日志。你可以根据需要在任何地方调用这些日志方法,例如log.info(), log.debug(), log.warning(), 和 log.error()

3. 运行应用

确保你的Seq服务器正在运行,并且URL和API密钥配置正确。然后运行你的Flutter应用。你应该能够在Seq服务器上看到记录的日志。

注意事项

  • 确保你的Seq服务器URL和API密钥是正确的。
  • 根据你的需求调整日志级别。
  • 如果Seq服务器不需要API密钥,可以省略apiKey参数。

这样,你就成功地在Flutter项目中配置了seq_logger并记录了日志。希望这个示例对你有帮助!

回到顶部