This page looks best with JavaScript enabled

Rust 中的日志库

 ·  ☕ 1 min read

log 库

log 是 Rust 的一个“日志门面” 库。
它把日志实际的功能抽象出来,提供了单独的 API ,具体的日志库则实现 log 定义的 API 。这样实现的好处就在于,不用绑定特定的日志框架,在程序启动时指定即可。

Cargo.toml 中引入 log 库:

1
2
[dependencies]
log = "0.4"

与一般的日志相同,log 定义了 5 个日志级别:

  • Error: 错误级别
  • Warn: 危险警告
  • Info: 有用的信息
  • Debug: 调试信息
  • Trace: 最低级别,详细的信息

一般的生产环境下,我们会使用 Warn 或者 Info 级别的日志,在开发调试时,则会使用 DebugTrace 级别方便跟踪调试。

与之相对应,log 库提供了 5 个宏,可以方便开发者打印相应级别的日志。分别是
error!
warn
info!
debug!
trace!

Log Trait

Log Traitlog 的核心,

1
2
3
4
5
pub trait Log: Sync + Send {
    fn enabled(&self, metadata: &Metadata) -> bool;
    fn log(&self, record: &Record);
    fn flush(&self);
}
  • fn enabled(&self, metadata: &Metadata) -> bool 是否输出这个日志。一般根据 Metadata 中的日志级别来判断。
  • fn log(&self, record: &Record) 记录日志。
  • fn flush(&self) 刷新缓存的日志。

实现一个简单的日志 Logger

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
use log::{Record, Level, Metadata};
struct SimpleLogger;
impl log::Log for SimpleLogger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= Level::Info
    }
    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            println!("{} - {}", record.level(), record.args());
        }
    }
    fn flush(&self) {}
}

通过 set_logger 方法安装 Logger,set_max_level 来调整最高日志级别:

1
2
3
4
5
6
7
8
use log::{SetLoggerError, LevelFilter};

static LOGGER: SimpleLogger = SimpleLogger;

pub fn init() -> Result<(), SetLoggerError> {
    log::set_logger(&LOGGER)
        .map(|()| log::set_max_level(LevelFilter::Info))
}

Rust 常用的日志库

Share on

Serendipity
WRITTEN BY
Serendipity
iOS/Golang/Rust

What's on this Page