最近闲来无事,撸了一个日志插件,功能很简单

在开发机上开启一个服务端

然后客户端(不仅是 flutter,而是只要可以使用dart:io就可以)开启远程连接,然后就可以发送日志到服务端了

好处

这样的好处是,开发机可以实时接收到日志,并且保存到文件中

因为我们很多时候会发生日志超出一个长度(好像是 1000 个),然后在 console 中不能完整显示的问题,比如网络网文请求,如果响应的报文不完整就不能复制出完整的 json,有的错误不太好定位

使用这个插件后,就可以在开发机简单的通过命令保存日志,方便后续定位

只要你的客户端可以访问到服务端,这就能实现

开发过程

使用WebSocket连接,这个类在 dart 中依托于dart:io包,所以如果你是dart web,可能就用不了这个了,flutterdart vm中是没问题的

这个库支持使用 pub global, 配置 dart 和 pub 到环境变量后可以直接通过log4d在命令行中开启

安装

1. 安装

参考pub上的 install 标签

pub global activate log4d

这一步完成后可以通过log4d,log4d_client 来使用插件

2.客户端安装

作为一个库来使用, 首先在 pubspec.yaml 中加入依赖

dependencies:
  log4d: ^1.0.3 # 这一步参考最新版

3.获取库

pub getflutter packages get

4. 导入

import 'package:log4d/log4d.dart';

使用

参考文档

简单的使用方式就是服务端在命令行中开启

1. 开启服务端

log4d -o build/test.log 这样就成功开启了,并且会在接受到日志后将日志保存到指定的目录下

2. 在 flutter 中使用

封装一个简单的帮助类

import 'dart:async';

import 'package:log4d/log4d.dart';

class LogHelper {
  Log4dClient _client;

  bool isLog = true;

  bool isRemote = true;

  LogHelper._() {
    _client = Log4dClient();
  }

  Future connectRemote() async {
    await _client.connect();
  }

  static LogHelper _instance;

  factory LogHelper() {
    _instance ??= LogHelper._();
    return _instance;
  }

  void info(String msg) {
    if (isLog) print(msg);

    if (isLog && isRemote) {
      _client.sendEntity(
        LogEntity()
          ..level = Level.info
          ..msg = msg,
      );
    }
  }
}

3. 在 main 方法中初始化帮助类

var log = LogHelper();
void main() async {
  await log.connectRemote();

  log.info("你好");
  runApp(MyApp());
}

后续只需要调用log.info('msg');就可以将日志发送到开发端

控制台会有日志显示,还会实时写入文件

关于插件

本身只是为了临时调试开发的插件,所以不支持太多的定制化选项,时间也只记录时分秒,不包含日期

如果真的有别的需求,欢迎在项目的 issue 中提交 不保证开发 😉

后记

本篇主要使用了 pub global 的功能作为命令行,如果有什么命令行的小脚本,又对于 python/shell/node 不太熟悉,完全可以使用 dart 进行开发