Flutter _ 日志还能这么打印,太秀了!,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, // 日志是否
有颜色 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)),);
评论