Rust 中的日志管理

本篇内容我们来浅聊一下 Rust 中的日志功能。

在程序运行过程中,常需要使用日志来记录程序发生的事情,其中包括了时间、地点和具体内容等信息。

日志级别

我们一般会为日志区分各种级别:

  • Debug: 调试信息,这一类主要为开发者提供调试便利的,比如说详细打印加载的配置信息。
  • Info: 一般信息,用于记录程序运行期间的一些重要信息的,比如程序状态的变化。
  • Warn: 警告信息,用于需要特别注意的日志内容,还没有达到 Error 的级别。
  • Error: 错误信息,用于程序级别的错误或者严重的业务错误,这种错误通常不会影响程序运行。
  • Fatal: 致命错误,出现了特别严重的错误,会导致程序没办法继续运行的那种。

日志 Crate

介绍几个我们在 Rust 中较为常用的 日志相关 包。

log

log 是由 Rust 官方维护的日志库,它提供了一些简单的方法让开发者可以快速生成日志:

1
2
3
4
5
6
7
8
9
10
11
12
use log::{info, debug, warn};

pub fn my_function(name: &str) -> bool {
debug!("starting to run my function!");
if name == "mrxiaozhuox" {
info!("name verification successful!");
return true;
} else {
warn!("name verification failed!");
return false;
}
}

可以看到,log 库使用了几种易用的宏来生成日志:info! debug! warn! error! fatal!

那么这些日志会被 打印/存放 到哪里呢?我们直接调用这段代码,会发现控制台没有打印任何东西。

这是因为,它仅为其他日志库提供了基础,当你引入了其他具体实现了日志输出的库后,这些方法就有用了。

目前 Rust 的日志库都基于 log 开发,所以说它更像是一种标准。我们接下来介绍的库也都基于它。

log4rs

log4rs 是一款高度可配置的日志框架(灵感来源于 log4j 框架)

我个人有几个项目都在使用它,这也是为什么我把它放在第二位介绍!

我们可以通过 log4rs 提供的 Config 对象进行详细的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 日志级别:这里的 Trace 为最低级别(比 Debug 还低)
let logger_level = log::LevelFilter::Trace;

// 控制台输出器:我们在这里定义了输出的结构 "[{l}] {d} - {m}{n}"
let console = ConsoleAppender::builder()
.encoder(Box::new(PatternEncoder::new("[{l}] {d} - {m}{n}")))
.build();

let config = Config::builder()
.appender(Appender::builder().build("console", Box::new(console)))
.build(Root::builder().appender("console").build(logger_level))
.unwrap();

log4rs::init_config(config);

使用 log4rs 你可以为不同的日志等级,情况制定不同的输出器。或者同时将日志同步输出在控制台和文件之中。本框架拥有极高的可配置性。具体的使用方法可以查阅官方文档的内容!

env_logger

env_logger 可以允许你通过环境变量来配置日志。

1
2
3
4
5
6
7
8
9
use log::info;

fn main() {
env_logger::init();

info!("starting up");

// ...
}

然后我们通过 RUST_LOG 环境变量来配置一些信息:

1
2
$ RUST_LOG=info ./main
[2018-11-03T06:09:06Z INFO default] starting up

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!