写点什么

Flutter _ 日志还能这么打印,太秀了!,android 移动应用基础教程

用户头像
Android架构
关注
发布于: 刚刚

info,warning,error,wtf,nothing,}


当你要打印日志的时候,只需实例化一个 Logger 对象,然后调用不同级别的打印方法就可以了。


void main() {var _logger = Logger(printer: PrettyPrinter(methodCount: 0,),);_logger.v('verbose message');_logger.d('debug message');_logger.i('info message');_logger.w('warning message');_logger.e('error message');_logger.wtf('wft message');}


下图是上面代码所打印出来的效果。



logger 除了使用简单之外,输出的日志也很优美。在 Logger 的构造函数中,我们可以传入特定的打印器、过滤器、输出位置等参数自由配置,下面是 Logger 的构造函数。


Logger({LogFilter? filter, // 过滤器,可以区分开发环境与生产环境 LogPrinter? printer, // 打印器,控制日志输出样式和堆栈信息等 LogOutput? output, // 输出器,控制日志输出位置。可以是控制台、文件、内存 Level? level,}) : _filter = filter ?? DevelopmentFilter(),_printer = printer ?? PrettyPrinter(),_output = output ?? ConsoleOutput() {_filter.init();_filter.level = level ?? Logger.level;_printer.init();_output.init();}


如果不传入任何参数,默认过滤器是开发者模式,打印器是漂亮的打印器、输出位置是控制台。

简单封装

打印日志在项目中是全局的,为了能在项目中任意地方使用打印功能,最好封装一下,如下是一个简单的封装,Logger 只需要实例化一次,之后在项目中任何地方都可以调用各个级别的打印方法。这里我使用了 PrefixPrinter 打印器包装了 PrettyPrinter 打印器。


class Log {static Logger _logger = Logger(printer: PrefixPrinter(PrettyPrinter()),);


static void v(dynamic message) {_logger.v(message);}


static void d(dynamic message) {_logger.d(message);}


static void i(dynamic message) {_logger.i(message);}


static void w(dynamic message) {_logger.w(message);}


static void e(dynamic message) {_logger.e(message);}


static void wtf(dynamic message) {_logger.wtf(message);}}

logger 的打印器

logger 的打印器是 logger 目前最核心的功能,本文会重点讲解打印器。以 PrettyPrinter() 打印器为例,首先看一下它的构造函数,如下。


PrettyPrinter({this.stackTraceBeginIndex = 0, // 方法栈的开始下标 this.methodCount = 2, // 打印方法栈的个数 this.errorMethodCount = 8, // 自己传入方法栈对象后该参数有效 this.lineLength = 120, // 每行最多打印的字符个数 this.colors = true, // 日志是否


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


有颜色 this.printEmojis = true,// 是否打印 emoji 表情 this.printTime = false, // 是否打印时间})


使用 PrettyPrinter 不指定任何参数,默认的打印方式如上,接着用我们上面刚刚封装好的代码。打印看看效果。


// LogTest.dartvoid main(){Log.w("PrettyPrinter warning message");}



LogTest.dart 的 main 方法中打印了一条 warning 级别的日志,因为没有指定 PrettyPrinter 的任何参数,所以打印出的栈方法默认是#0#1两条。读者应该知道调用方法其实是不停的在向系统压栈,最后调用的方法肯定在栈顶,很显然,#0是栈顶。那么栈底调用的方法是哪个呢?其实读者只要指定打印的方法栈个数足够大,就可以看到了


不知道读者有没有发现一个问题,我们封装后,每次打印的日志都会携带一条 #0 的方法栈日志。大多时候我们不关心封装里面的方法调用,只关心这条日志是从哪打印的(上面是#1),这样就可以快速定位到对应代码的位置。


现在,思考如何将#0去除?其实也很简单,通过查看源码。我们只要指定 stackTraceBeginIndex 和 methodCount 的值,就可以控制输出了。现在为 PrettyPrinter 指定这两个参数的值,分别是 5 和 1。


static Logger _logger = Logger(printer: PrefixPrinter(PrettyPrinter(stackTraceBeginIndex: 5,methodCount: 1)),);

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Flutter _ 日志还能这么打印,太秀了!,android移动应用基础教程