18. rust日志库使用介绍

一、前言

日志对于开发大型应用来说是非常重要的组成部分,因为它可以帮助开发者定位错误。

毕竟大部分应用开发出来都是给其它用户使用的,一旦应用在用户电脑上触发了某个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;
}

该函数中写了两个打印语句,第一条只是一个提示信息,表明该函数被执行了,所以大多数时候我们可能并不需要它一直被打印,只是在某些特殊情况下,需要判断它是否被程序执行了才需要它打印一下看看情况。

而第二个打印语句就比较重要了,因为一旦程序执行到这个位置就代表这个函数执行出现了错误,这种情况按理来说只要出现了就一定需要被打印出来,方便开发者快速定位错误的位置。

为了满足这样的需求,正如我代码中写的infoerror标识字符串一样,rust官方就为日志定义了五个日志级别:

  1. error:错误
  2. warn:警告
  3. info:提示
  4. debug:调试
  5. 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"

此时我并不需要更改其它任何代码,直接初始化该库,就能打印日志了:

image-20240113170850486

此时我的命令为cargo run,其默认只打印最高级别的日志,其它打印日志会被忽略。

可以看到,该日志信息不仅仅只是字符串,还有时间、级别、日志所属模块名,甚至级别ERROR还有颜色,非常方便我们观察。

这可比普通的字符串打印好用多了。

而想要调整其打印的日志级别,就需要看你想要使用什么库了,由于这里我使用的env_loggger库,正如其名字,调整它打印日志等级的方式就是通过环境变量,具体来说就是:RUST_LOG

这里我先直接在代码中设置环境变量演示一下它的用法:

image-20240113172114474

如上图所示,当我通过函数set_var设置RUST_LOG环境变量为第三级别info后,此时控制台就会打印所有大于等于该级别以上的日志信息。

其环境变量的值就是这些日志的等级,也就是这里用的宏名字,虽然官方文档说不区分大小写,比如使用INFO也行,但还是推荐大家使用小写的info

除了在代码中修改,我们还可以直接在终端设置,如果你和我一样默认使用的PowerShell,那么可以这样做:

image-20240113174047795

PowerShell中设置环境变量是需要在前面添加一个$env:的,此时不再需要在代码中设置,而只需要在运行前设置一次即可,此后只要你不需要更改日志等级、并且该终端未被关闭,那么也无需多次设置,可以一直使用。

此时就方便的多了,你可以随意调整需要打印的日志等级,而且有颜色也非常方便观察。

如果你使用的是默认的cmd窗口,那么可以参考下面的命令,也就是不添加前面的$env:即可:

image-20240113174424828

只不过cmd比较老旧,缺乏很多特性,我现在用的比较少。

四、log4rs

上面使用的env_loggger只适合入门、简单的程序使用,对于一些大型项目,我们往往还需要更加灵活、强大的日志库。

比如这里要介绍的log4rs就是rust中非常强大的一个日志库。

首先我们需要先将其添加到本项目中:

log4rs = "1.3.0"
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux