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

这篇具有很好参考价值的文章主要介绍了flutter开发实战-日志logger写入文件及print。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

在开发中,需要日志logger写入文件,方便日后查看出现的问题。这里记录之前的实现方案。
使用的日志插件是logger
flutter 日志库,flutter开发实战,flutter,移动开发,flutter,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://www.toymoban.com/news/detail-637941.html

到了这里,关于flutter开发实战-日志logger写入文件及print的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Logback日志记录只在控制台输出sql,未写入日志文件【解决】

    原因:持久层框架对于Log接口实现方式不一样,日记记录的位置及展示方式也也不一样 可以分别配置到两个环境中,dev用StdOutImpl,prod用Slf4jImpl或者其他的都行,具体需要看他是如何实现的,使用logger对象输出的都是会写入日志的,使用System.out或err的只会在控制台显示,以下是实验

    2024年02月09日
    浏览(61)
  • 如何在Node.js将console日志写入到文件

    在node.js开发中,需要将日志重定向到文件,又不想用其他日志框架,查询node文档发现可以用如下方式简单实现: 参考: 控制台 | Node.js v18.18.2 文档

    2024年01月21日
    浏览(41)
  • 神秘解密:stressapptest源码Logger日志操作深度剖析

    stressapptest 是一个用于测试系统稳定性和可靠性的开源应用程序。它通过模拟在系统上运行的压力,并检查系统在这种严格条件下的稳定性。stressapptest 是一个非常有用的工具,可以在不同环境中对系统进行稳定性测试和故障排除。 Logger类的定义,它提供了日志记录的功能和

    2024年04月12日
    浏览(26)
  • Microsoft.Extensions.Logging.ILogger实现按类名写入不同的日志文件

    使用Microsoft.Extensions.Logging框架可以很方便地实现按类名写入不同的日志文件。你可以通过配置LoggerProvider来实现此功能。下面是一个示例代码,演示如何按类名将日志写入不同的日志文件: 使用时,你可以在Startup类的ConfigureServices方法中注册ILoggerProvider,并指定日志文件夹路

    2024年02月04日
    浏览(40)
  • C++服务器框架02_日志系统02_logger

    sylar/log.h sylar/log.cpp

    2024年02月12日
    浏览(42)
  • Django REST framework 日志(重写drf_api_logger)

    默认的 drf-api-logger 没有保存用户并且没有获取日志的接口 本文通过重写 drf-api-logger 增加访问用户及获取日志的接口 并且增加定时器删除日志 文档 优点 :您可以将 API 信息记录到数据库中或侦听不同用例的记录器信号,也可以同时执行这两项操作。 记录器使用单独的线程来

    2024年02月11日
    浏览(43)
  • rust库学习-env_logger(actix-web添加彩色日志、rust添加彩色日志 )

    我们在进行rust的web开发时,如果不指定日志,就不会有输出,非常不友好 这里我们使用 env_logger 进行日志打印 env_logger 需要配合 log 库使用, env_logger 是 Rust 社区中一个非常流行的日志记录库。它提供了一个简单且易于使用的接口,用于配置和记录日志消息。 env_logger 可以与

    2024年02月11日
    浏览(34)
  • 【运维知识大神篇】超详细的ELFK日志分析教程7(filebeat常用模块+filebeat采集固定格式日志+自定义日志格式写入ES+EFK架构转ELFK架构+两个业务实战练习)

    本篇文章继续给大家介绍ELFK日志分析,详细请见下面目录。 目录 filebeat采集nginx日志 filebeat模块使用 一、Nginx模块 二、tomcat模块 三、filebeat写数据到ES集群自定义索引 四、filebeat自定义字段之nginx写入ES 五、filebeat自定义字段之tomcat写入ES 六、indices模块实现多个input写入不同

    2024年02月05日
    浏览(41)
  • Spring Boot日志:从Logger到@Slf4j的探秘

    写在前面 Hello大家好,今日是2024年的第一天,祝大家元旦快乐🎉 2024第一篇文章从 SpringBoot日志 开始 在我们日常的公司开发中,难免都会存在着大大小小的BUG,不可能会有公司说我们的项目做出来是没有BUG的,那既然或多或少会BUG的话,要如何去发现BUG呢? 那对于我们程序

    2024年02月03日
    浏览(46)
  • c语言中文件读入处理写入实战

    可以使用文件操作和字符串处理函数来实现将读取的文件内容去掉空白的内容,然后将其连起来的功能。下面是一个示例代码: 用c语言写个程序,读取input.txt文件,把读取的内容,处理成先写一个十六进制的地址00000000,再冒号加空格,两个字节再加上一个空格,两个字节加

    2024年01月18日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包