Flutter日志管理插件loki的使用

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

Flutter日志管理插件loki的使用

Loki 是一个命令行工具,专为管理包含多个包的 Dart 和 Flutter 项目而设计。Loki 的灵感来源于 melos,但 melos 缺乏对不同风味的应用程序的支持,并且在热重载/重启时由于分离的标准输入(stdin)遇到了问题。因此,这个包应运而生。

特性

  • 运行应用程序
    • 在调试、发布和性能模式下运行应用程序
    • 在不同风味下运行应用程序
  • 清理工作区
  • 获取工作区中的依赖项
  • 列出工作区中的包和应用
  • 使用或不使用标准输入执行自定义脚本
  • 验证配置文件

安装

要从命令行安装该包,请先克隆仓库:

git clone https://github.com/cybertronbaka/loki.git

然后激活该包:

dart pub global activate --source path <路径到克隆的目录>

或者直接安装该包:

dart pub global activate loki

设置

Loki 特别设计用于与工作区协同工作。工作区是一个包含所有计划同时开发的包的目录。其根目录应该包含一个 loki.yaml 文件。

配置工作区

假设我们的示例工作区具有以下文件结构:

workspace/
  loki.yaml
  apps/
    app1/
      ...
      pubspec.yaml
    app2/
      ...
      pubspec.yaml

创建 loki.yaml 文件:

loki init

或者手动创建 loki.yaml 文件并指定 namepackages 字段:

name: <项目名称>
description: <描述>
packages:
  - apps

使用

向工作区添加脚本

Loki 可以扩展功能,包括在所有包中执行脚本。例如,要在应用中执行 flutter run,可以将新的脚本项添加到 loki.yaml 中:

name: <项目名称>
description: <描述>
packages:
  - apps
scripts:
  run:p1:
    name: 运行App1
    description: 运行App1
    exec: flutter run
    working_dir: apps/app1
    stdin: true
  test:
    name: 运行测试
    exec: flutter test
  analyze:
    name: 分析
    exec: dart analyze
  test:analyze:1:
    exec: lkr analyze && loki run test

执行脚本

要获取脚本列表,可以执行:

loki help run

要执行 run:p1 脚本,可以使用以下命令:

loki run run:p1

运行应用

要在 dev 风味下以 release 模式运行 app1 应用:

loki app app1 --flavor dev -e release

或者简化为:

loki app app1 -f dev -e release

获取帮助

要获取运行应用的帮助信息:

loki app <应用名称> -h

命令

完整的命令列表和参数可以通过运行 loki help 查看:

> loki help

 _     ____  _  __ _ 
/ \   /  _ \/ |/ // \
| |   | / \||   / | |
| |_/\| \_/||   \ | |
\____/\____/\_|\_\\_/
                 v0.0.1

一个用于管理包含多个包的 Dart 和 Flutter 项目的命令行工具。

仅因运行 flutter 应用时 melos 存在标准输入(stdin)问题而创建。

由 Dorji Gyeltshen (@cybertronbaka) 热情制作。

用法: loki <命令> [参数]

全局选项:
-h, --help    打印此使用信息。

可用命令:
  app        在工作区中运行 flutter 应用
  clean      在所有包和应用中运行 `flutter clean`
  fetch      在包和应用中安装依赖项
  init       创建 loki.yaml。
  list       列出所有本地包
  run        运行由工作区 loki.yaml 配置文件定义的脚本
  validate   验证 loki.yaml 配置文件
  version    打印版本信息

运行 "loki help <命令>" 以获取更多有关命令的信息。

说明牌

使用 Loki?添加一个说明牌来展示它:

静态徽章


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

1 回复

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


在Flutter项目中,使用Loki日志管理插件可以帮助你有效地收集、存储和分析应用程序的日志。虽然Loki本身是一个水平可扩展、高可用性、多租户的日志聚合系统,通常用于基础设施日志,但Flutter社区可能有一些封装好的插件或库来简化与Loki的集成。这里,我将展示一个假设性的Flutter插件使用案例,这个插件可能名为flutter_loki_logger(请注意,这个插件名称是假设的,实际中可能不存在这样的插件,或者名称不同)。

假设性Flutter Loki Logger插件使用案例

首先,确保你的Flutter项目已经设置好了,并且你已经在pubspec.yaml文件中添加了flutter_loki_logger依赖(假设存在):

dependencies:
  flutter:
    sdk: flutter
  flutter_loki_logger: ^x.y.z  # 替换为实际版本号

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

配置和使用Loki Logger

在你的Flutter应用程序中,你可以这样配置和使用Loki Logger:

import 'package:flutter/material.dart';
import 'package:flutter_loki_logger/flutter_loki_logger.dart'; // 假设的导入路径

void main() {
  // 配置Loki Logger
  final lokiLogger = LokiLogger(
    url: 'http://your-loki-server:3100/loki/api/v1/push', // Loki服务器的URL
    labels: {'app': 'your_app_name'}, // 可选的标签,用于在Loki中区分日志来源
  );

  // 启动日志记录
  runZonedGuarded(() {
    runApp(MyApp(lokiLogger: lokiLogger));
  }, (error, stackTrace) {
    // 捕获未处理的异常并记录到Loki
    lokiLogger.error('Unhandled Exception', error, stackTrace);
  });
}

class MyApp extends StatelessWidget {
  final LokiLogger lokiLogger;

  MyApp({required this.lokiLogger});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Loki Logger Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Loki Logger Demo'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 记录信息日志
              lokiLogger.info('This is an info log');

              // 记录警告日志
              lokiLogger.warn('This is a warning log');

              // 记录错误日志(不带堆栈跟踪)
              lokiLogger.error('This is an error log without stack trace');

              try {
                throw Exception('Demo exception');
              } catch (e, st) {
                // 记录错误日志(带堆栈跟踪)
                lokiLogger.error('This is an error log with stack trace', e, st);
              }
            },
            child: Text('Log Messages'),
          ),
        ),
      ),
    );
  }
}

假设的LokiLogger类定义

由于flutter_loki_logger插件是假设的,这里提供一个简化的LokiLogger类定义示例,以展示其可能的实现方式。在实际使用中,你需要根据具体插件的文档进行调整。

import 'dart:convert';
import 'dart:typed_data';
import 'package:http/http.dart' as http;

class LokiLogger {
  final String url;
  final Map<String, String> labels;

  LokiLogger({required this.url, required this.labels});

  void info(String message, {Map<String, dynamic> additionalFields = const {}}) {
    _log('info', message, additionalFields);
  }

  void warn(String message, {Map<String, dynamic> additionalFields = const {}}) {
    _log('warn', message, additionalFields);
  }

  void error(String message, Object error, StackTrace stackTrace,
      {Map<String, dynamic> additionalFields = const {}}) {
    final errorInfo = {
      'error': error.toString(),
      'stackTrace': stackTrace.toString(),
    };
    _log('error', message, {...additionalFields, ...errorInfo});
  }

  void _log(String level, String message, Map<String, dynamic> additionalFields) {
    final logEntry = {
      'timestamp': DateTime.now().toIso8601String(),
      'level': level,
      'message': message,
      'labels': labels,
      ...additionalFields,
    };

    final jsonData = jsonEncode(logEntry);
    final body = Uint8List.fromList(jsonData.codeUnits);

    http.post(Uri.parse(url), body: body, headers: {
      'Content-Type': 'application/json',
    }).then((response) {
      if (response.statusCode != 204) {
        // 处理非204响应(Loki期望成功时返回204)
        print('Failed to log to Loki: ${response.body}');
      }
    }).catchError((error) {
      // 处理网络错误
      print('Network error while logging to Loki: $error');
    });
  }
}

注意事项

  1. 实际插件可能存在差异:上述代码中的LokiLogger类是一个简化的示例,用于说明可能的实现方式。实际使用的插件可能有不同的API和配置方法。
  2. 安全性:在生产环境中,确保与Loki服务器的通信是安全的(例如,使用HTTPS)。
  3. 错误处理:在实际应用中,可能需要更详细的错误处理和日志记录策略。
  4. 性能考虑:频繁的网络请求可能会影响应用性能,考虑批量发送日志或使用本地缓存。

由于flutter_loki_logger是假设的插件名称,你可能需要搜索Flutter社区中实际的Loki日志管理插件,并根据其文档进行配置和使用。

回到顶部