一、前言
日志对于开发大型应用来说是非常重要的组成部分,因为它可以帮助开发者定位错误。
毕竟大部分应用开发出来都是给其它用户使用的,一旦应用在用户电脑上触发了某个bug导致崩溃,你很难直接看出来bug的位置,这个时候就是日志发挥作用的时候了。
二、认识日志
日志听起来比较高级,实际上是一个非常简单的东西,就是打印字符而已。
比如最简单的日志,我们完成可以直接使用println
宏实现:
println!("info:main function")
只不过这样做缺陷太大,首先就是大多数时候我们都是希望可以分情况打印不同日志的。
比如下面这种情况:
fn divi(a: i32, b: i32) -> i32 {
println!("info:执行了divi函数");
if b == 0 {
println!("error:参数不能为0");
return 0;
}
return a / b;
}
该函数中写了两个打印语句,第一条只是一个提示信息,表明该函数被执行了,所以大多数时候我们可能并不需要它一直被打印,只是在某些特殊情况下,需要判断它是否被程序执行了才需要它打印一下看看情况。
而第二个打印语句就比较重要了,因为一旦程序执行到这个位置就代表这个函数执行出现了错误,这种情况按理来说只要出现了就一定需要被打印出来,方便开发者快速定位错误的位置。
为了满足这样的需求,正如我代码中写的info
、error
标识字符串一样,rust官方就为日志定义了五个日志级别:
error
:错误warn
:警告info
:提示debug
:调试trace
:跟踪
事实上并不仅仅只是rust中的日志,其它语言日志库基本都是这样做的。
上面五个等级从上到下级别依次递减,看其名字其实你大概也能看出这些日志应该在哪些地方被使用了。
三、基本使用
为了方便使用,rust官方就推出了一个标准的日志库log。
只需要在配置文件中写上它的依赖即可:
log = "0.4.20"
对应于上面五个日志等级,log库就为我们准备了五个专门的打印日志的宏:
use log::{debug, error, info, trace, warn};
fn main() {
error!("错误日志:{}", 111);
warn!("警告日志:{}", 222);
info!("提示日志:{}", 333);
debug!("调试日志:{}", 444);
trace!("跟踪日志:{}", 555);
}
就像上面这样,它们的写法和println!
宏是完全一样的,可以格式化输出字符串,唯一不同的地方是换了个名字。
这样做的好处就在于,我们可以在任何想要打印日志的地方都写上相应的打印日志语句,然后通过一些配置来控制哪些等级的日志信息被打印,哪些等级的日志信息不需要被打印。
同时注意,上面的代码运行之后是没有任何效果的,因为它仅仅只是一个“门面”,没有任何实际的内容。
官方这样做的好处就在于,我们在代码中可以用统一的日志规范来写代码,至于日志的具体实现方案,我们可以任意选用其它自己希望使用的日志库。
比如以前感觉某个日志库好用,但用了一段时间后又觉得另外一个日志库好用,那么基本就可以实现一键切换,而无需过多烦人的配置。
比如这里我以env_logger日志库为例:
env_logger = "0.10.1"
此时我并不需要更改其它任何代码,直接初始化该库,就能打印日志了:
此时我的命令为cargo run
,其默认只打印最高级别的日志,其它打印日志会被忽略。
可以看到,该日志信息不仅仅只是字符串,还有时间、级别、日志所属模块名,甚至级别ERROR
还有颜色,非常方便我们观察。
这可比普通的字符串打印好用多了。
而想要调整其打印的日志级别,就需要看你想要使用什么库了,由于这里我使用的env_loggger
库,正如其名字,调整它打印日志等级的方式就是通过环境变量,具体来说就是:RUST_LOG
。
这里我先直接在代码中设置环境变量演示一下它的用法:
如上图所示,当我通过函数set_var
设置RUST_LOG
环境变量为第三级别info
后,此时控制台就会打印所有大于等于该级别以上的日志信息。
其环境变量的值就是这些日志的等级,也就是这里用的宏名字,虽然官方文档说不区分大小写,比如使用INFO
也行,但还是推荐大家使用小写的info
。
除了在代码中修改,我们还可以直接在终端设置,如果你和我一样默认使用的PowerShell
,那么可以这样做:
PowerShell
中设置环境变量是需要在前面添加一个$env:
的,此时不再需要在代码中设置,而只需要在运行前设置一次即可,此后只要你不需要更改日志等级、并且该终端未被关闭,那么也无需多次设置,可以一直使用。
此时就方便的多了,你可以随意调整需要打印的日志等级,而且有颜色也非常方便观察。
如果你使用的是默认的cmd窗口,那么可以参考下面的命令,也就是不添加前面的$env:
即可:
只不过cmd比较老旧,缺乏很多特性,我现在用的比较少。
四、log4rs
上面使用的env_loggger
只适合入门、简单的程序使用,对于一些大型项目,我们往往还需要更加灵活、强大的日志库。
比如这里要介绍的log4rs
就是rust中非常强大的一个日志库。
首先我们需要先将其添加到本项目中:
log4rs = "1.3.0"