Flutter开发--日志

936 阅读3分钟

开发什么都少不了打个日志,从而可以快速定位或者帮助快速定位出问题的地方。没有哪个开发者想要在出问题的时候把所有的可能出问题的代码都刷一次吧?!

在Flutter开发中最常用的莫过于:

print("某用户ID,执行了某操作")

或者还可以有debugPrint。开始的时候用这个还是很不错的,不过长期来说不太合适。本身在每次打出print的时候Flutter就会提示:“Dont invoke print in production code.Try using a logging framework.”。当然使用一个日志框架的理由很多,我们就不过多的赘述了,现在开始来看看怎么用一个*logging framework**。

安装配置

Flutter有很多的logging framework,这里我们用的是这个Logger。按照它自己的说明,可以适配Flutter支持的所有平台。最关键的是它使用方便,而且提供良好的日志格式。

安装

flutter pub add logger

新建基本的日志

要开始日志,很简单:

var logger = Logger();

logger.log(Level.verbose, "这是一个log");

也可以直接的把错误放进logger里处理:

var error = Error();
var logger = Logger();
logger.log(Level.trace, "a log", error: err, stackTrace: err.stackTrace);

Log的结果是什么呢:

I/flutter ( 9343): ┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

I/flutter ( 9343): │ Instance of 'Error'

I/flutter ( 9343): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

I/flutter ( 9343): │ #0 HomePage.build (package:flutter_todo/src/getx/pages/home_page.dart:18:12)

I/flutter ( 9343): │ #1 StatelessElement.build (package:flutter/src/widgets/framework.dart:5551:49)

I/flutter ( 9343): │ #2 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5481:15)

I/flutter ( 9343): │ #3 Element.rebuild (package:flutter/src/widgets/framework.dart:5197:7)

I/flutter ( 9343): ├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄

I/flutter ( 9343): │ a log

I/flutter ( 9343): └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

可以看到日志的格式化作的已经相当好,并且这个日志的结构可以分为三部分:

  • 第一部分:Instance of Error, 这是日志里错误的文本内容
  • 第二部分:这是错误发生的调用栈:stack trace
  • 第三部分:这是日志的文本描述

在第二部分stack trace的描述中也分为两部分:

  • 首先,是错误发生的类和方法,比如HomePage.build
  • 这个方法所在的文件的路径和具体哪一行哪一列,比如:(package:flutter_todo/src/getx/pages/home_page.dart:18:12)

使用日志的Level

我们在记录日志的时候需要给日志设置Level。这样在查看浩如烟海的日志的时候可以更快的找到需要的日志。Logger的日志的Level有:

logger.t("Trace log");

logger.d("Debug log");

logger.i("Info log");

logger.w("Warning log");

logger.e("Error log", error: 'Test Error');

logger.f("What a fatal log", error: error, stackTrace: stackTrace);

最终的输出结果:

所以,开始的那段代码也可以写成是这样的:

logger.t("a log", error: err, stackTrace: err.stackTrace);

六个日志对应着六种颜色。现在如果只要显示某个Level的日志可以这样:

Logger.level = Level.warning

这下就只有warning、error和fatal三个日志显示出来了:

日志过滤器

App里都打好了点,记录了各种日志。但是,日志多了看不过来。虽然可以定义显示日志的level,但是可控的粒度还是太大。Logger专门提供了过滤器,让开发者对显示什么样的日志做更加精细的控制。

class TheLogFilter extends LogFilter {
  @override
  bool shouldLog(LogEvent event) {
    if (event.level == Level.warning || event.level == Level.error) {
      return true;
    }

    return false;
  }
}

上面定义的过滤器让日志只显示warning和error两个level的日志。如果只通过Level控制的话会显示三个level:分别是warning、error和fatal的。这次使用过滤器把fatal的也一起过滤掉了。

使用过滤器:

var logger = Logger(filter: TheLogFilter());

在初始化的时候把自定义的过滤器实例传到Logger构造函数就可以。

过滤器可以过滤的条件最基本的有shouldLog(LogEvent event)里event的几个属性可以使用。当然,这里说的是最基本的。开发者可以根据情况扩展过滤器的过滤条件。

过滤器的基本过滤条件

最后

希望通过本文可以让你学会Logger的基本使用方法。让你的app在记录日志,和查看日志的时候都更方便快捷。