我的编程空间,编程开发者的网络收藏夹
学习永远不晚

flutter开发实战-日志logger写入文件及print

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

flutter开发实战-日志logger写入文件及print

flutter开发实战-日志logger写入文件及print

在开发中,需要日志logger写入文件,方便日后查看出现的问题。这里记录之前的实现方案。
使用的日志插件是logger
在这里插入图片描述

一、引入日志插件

在工程中pubspec.yaml引入logger

logger: ^1.4.0

二、代码实现

使用比较简单,只需创建一个Logger实例并开始日志记录:

var logger = Logger();logger.d("Logger is working!");

也可以传递其他对象,如List、Map或Set,而不是字符串消息。

2.1 日志logger_manager

  • 使用logger时候,配置logger
FileOutput fileOutPut = FileOutput();    ConsoleOutput consoleOutput = ConsoleOutput();    List<LogOutput> multiOutput = [fileOutPut, consoleOutput];    logger = Logger(      filter: DevelopmentFilter(),      // Use the default LogFilter (-> only log in debug mode)      // printer: SimplePrinter(      //   colors: true,      //   printTime: true,      // ),      printer: HybridPrinter(        PrettyPrinter(          noBoxingByDefault: false,          methodCount: 2,          // number of method calls to be displayed          errorMethodCount: 8,          // number of method calls if stacktrace is provided          lineLength: 120,          // width of the output          colors: true,          // Colorful log messages          printEmojis: false,          // Print an emoji for each log message          printTime: true, // Should each log print contain a timestamp        ),        debug: SimplePrinter(),      ),
  • 写入文件的FileOutPut,其中用到了IOSink

IOSink可以方便将字节和文本输出,IOSink将字节的StreamSsink与StringSink组合,并且允许容易地输出字节和文本。

/// Writes the log output to a file.class FileOutput extends LogOutput {  final bool overrideExisting;  final Encoding encoding;  IOSink? _sink;  File? file;  String? _currentDate;  FileOutput({    this.overrideExisting = false,    this.encoding = utf8,  });  Future<void> getDirectoryForLogRecord() async {    String currentDate = getCurrentDay();    if (currentDate != _currentDate) {      final String fileDir = await createDirectory();      file = File('${fileDir}/${currentDate}.log');      _sink = file!.openWrite(        mode: overrideExisting ? FileMode.writeOnly : FileMode.writeOnlyAppend,        encoding: encoding,      );      _currentDate = currentDate;    }  }  String getCurrentDay() {    String currentDate =        DateUtil.formatDate(DateTime.now(), format: "yyyyMMdd");    return currentDate;  }    void init() {    directoryLogRecord(onCallback: () {});  }  void directoryLogRecord({required Function onCallback}) {    getDirectoryForLogRecord().whenComplete(() {      onCallback();    });  }    void output(OutputEvent event) {    directoryLogRecord(onCallback: () {      if (_sink != null) {        if (Level.info == event.level ||            Level.warning == event.level ||            Level.error == event.level) {          _sink?.writeAll(event.lines, '\n');        }      }    });  }    void destroy() async {    await _sink?.flush();    await _sink?.close();  }}
  • 实现使用logger_manager
Future<String> createDirectory() async {  final Directory directory = await getApplicationDocumentsDirectory();  var file = Directory(directory.path+"/"+"lyd");  try {    bool exist = await file.exists();    if (exist == false) {      await file.create();    }  } catch(e) {    print("createDirectory error");  }  return file.path;}class LoggerManager {  //私有构造函数  LoggerManager._internal() {    deleteLogsOfBefore7Day();    initLogger();  }  //保存单例  static LoggerManager _singleton = LoggerManager._internal();  //工厂构造函数  factory LoggerManager() => _singleton;  late Logger logger;  // log初始化设置  Future<void> initLogger() async {    FileOutput fileOutPut = FileOutput();    ConsoleOutput consoleOutput = ConsoleOutput();    List<LogOutput> multiOutput = [fileOutPut, consoleOutput];    logger = Logger(      filter: DevelopmentFilter(),      // Use the default LogFilter (-> only log in debug mode)      // printer: SimplePrinter(      //   colors: true,      //   printTime: true,      // ),      printer: HybridPrinter(        PrettyPrinter(          noBoxingByDefault: false,          methodCount: 2,          // number of method calls to be displayed          errorMethodCount: 8,          // number of method calls if stacktrace is provided          lineLength: 120,          // width of the output          colors: true,          // Colorful log messages          printEmojis: false,          // Print an emoji for each log message          printTime: true, // Should each log print contain a timestamp        ),        debug: SimplePrinter(),      ),      // printer: PrefixPrinter(PrettyPrinter(      //   noBoxingByDefault: true,      //   methodCount: 2,      //   // number of method calls to be displayed      //   errorMethodCount: 8,      //   // number of method calls if stacktrace is provided      //   lineLength: 120,      //   // width of the output      //   colors: true,      //   // Colorful log messages      //   printEmojis: false,      //   // Print an emoji for each log message      //   printTime: true, // Should each log print contain a timestamp      // )),      // printer: PrettyPrinter(      //   noBoxingByDefault: true,      //   methodCount: 2,      //   // number of method calls to be displayed      //   errorMethodCount: 8,      //   // number of method calls if stacktrace is provided      //   lineLength: 120,      //   // width of the output      //   colors: true,      //   // Colorful log messages      //   printEmojis: false,      //   // Print an emoji for each log message      //   printTime: true, // Should each log print contain a timestamp      // ),      // Use the PrettyPrinter to format and print log      output: MultiOutput(        multiOutput,      ), // Use the default LogOutput (-> send everything to console)    );  }  // Debug  void debug(String message) {    logger.d(message);  }  // verbose  void verbose(String message) {    logger.v(message);  }  // info  void info(String message) {    logger.i(message);  }  // warning  void warning(String message) {    logger.w(message);  }  // error  void error(String message) {    logger.e(message);  }  // 每次启动只保留7天内的日志,删除7天前的日志  Future<void> deleteLogsOfBefore7Day() async {    final String fileDir = await createDirectory();    // 获取目录的所有文件    var dir = Directory(fileDir);    Stream<FileSystemEntity> file = dir.list();    await for (FileSystemEntity x in file) {      // 获取文件的的名称      List<String> paths = x.path.split('/');      if (paths.isNotEmpty) {        String logName = paths.last.replaceAll('.log', '');        final logDate = DateUtil.getDateTime(logName);        final currentDate = DateTime.now();        //比较相差的天数        if (logDate != null) {          final difference = currentDate.difference(logDate!).inDays;          print("deleteLogsOfBefore7Day logDate:${logDate}, currentDate:${currentDate}, difference:${difference}");          if (difference > 7) {            var file = File(x.path);            // 删除文件            file.delete();          }        }      }    }  }}

2.2 在main.dart初始化logger

// 配置logger  await LoggerManager().initLogger();

2.3 使用LoggerManager

logger的level定义

enum Level {  verbose,  debug,  info,  warning,  error,  wtf,  nothing,}

可以在需要的地方使用LoggerManager

// verbose:LoggerManager().verbose("App started at main.dart");// debug:LoggerManager().debug("App started at main.dart");// info:LoggerManager().info("App started at main.dart");// warning:LoggerManager().warning("App started at main.dart");// error:LoggerManager().error("App started at main.dart");// wtf:LoggerManager().wtf("App started at main.dart");// nothing:LoggerManager().nothing("App started at main.dart");

三、小结

flutter开发实战-日志logger写入文件及print,使用的是logger进行实现,输出日志logger的不同level:verbose、debug、info、warning、error、wtf、nothing。

学习记录,每天不停进步。

来源地址:https://blog.csdn.net/gloryFlow/article/details/131654007

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

flutter开发实战-日志logger写入文件及print

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android开发实现读取Assets下文件及文件写入存储卡的方法

本文实例讲述了Android开发实现读取Assets下文件及文件写入存储卡的方法。分享给大家供大家参考,具体如下:调用一个反编译的.so文件,查看起加密和解密情况,需要解析上万的数组,而so文件加密解密都是通过Byte来进行,又需要把Str
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录