日志信息

记录调试信息到控制台

log-badge env_logger-badge cat-debugging-badge

log crate 提供了日志工具,env_logger crate 通过环境变量配置日志记录。log::debug! 宏的工作方式类似于其它 std::fmt 格式化的字符串。


fn execute_query(query: &str) {
    log::debug!("Executing query: {}", query);
}

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

    execute_query("DROP TABLE students");
}

运行上述代码时,并没有输出信息被打印。因为默认情况下,日志级别为 error,任何较低级别的日志信息都将被忽略。

设置 RUST_LOG 环境变量以打印消息:

$ RUST_LOG=debug cargo run

Cargo 运行后,会在输出的最后一行打印出调试信息:

DEBUG:main: Executing query: DROP TABLE students

记录错误信息到控制台

log-badge env_logger-badge cat-debugging-badge

正确的错误处理会将异常视为错误。下述实例中,通过 log 便捷宏 log::error!,将错误记录到 stderr。


fn execute_query(_query: &str) -> Result<(), &'static str> {
    Err("I'm afraid I can't do that")
}

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

    let response = execute_query("DROP TABLE students");
    if let Err(err) = response {
        log::error!("Failed to execute query: {}", err);
    }
}

记录信息时,用标准输出 stdout 替换标准错误 stderr

log-badge env_logger-badge cat-debugging-badge

使用 Builder::target 创建自定义的日志记录器配置,将日志输出的目标设置为 Target::Stdout


use env_logger::{Builder, Target};

fn main() {
    Builder::new()
        .target(Target::Stdout)
        .init();

    log::error!("This error has been printed to Stdout");
}

使用自定义日志记录器记录信息

log-badge cat-debugging-badge

本实例实现一个打印到 stdout 的自定义记录器 ConsoleLogger。为了使用日志宏,ConsoleLogger 实现了 log::Log trait,通过 log::set_logger 安置。

use log::{Record, Level, Metadata, LevelFilter, SetLoggerError};

static CONSOLE_LOGGER: ConsoleLogger = ConsoleLogger;

struct ConsoleLogger;

impl log::Log for ConsoleLogger {
  fn enabled(&self, metadata: &Metadata) -> bool {
     metadata.level() <= Level::Info
    }

    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            println!("Rust says: {} - {}", record.level(), record.args());
        }
    }

    fn flush(&self) {}
}

fn main() -> Result<(), SetLoggerError> {
    log::set_logger(&CONSOLE_LOGGER)?;
    log::set_max_level(LevelFilter::Info);

    log::info!("hello log");
    log::warn!("warning");
    log::error!("oops");
    Ok(())
}

记录到 Unix 系统日志

log-badge syslog-badge cat-debugging-badge

本实例实现将信息记录到 UNIX syslog。使用 syslog::init 初始化记录器后端。syslog::Facility 记录提交日志项分类的程序,log::LevelFilter 表示欲记录日志的等级,Option<&str> 定义应用程序名称(可选)。

#[cfg(target_os = "linux")]
#[cfg(target_os = "linux")]
use syslog::{Facility, Error};

#[cfg(target_os = "linux")]
fn main() -> Result<(), Error> {
    syslog::init(Facility::LOG_USER,
                 log::LevelFilter::Debug,
                 Some("My app name"))?;
    log::debug!("this is a debug {}", "message");
    log::error!("this is an error!");
    Ok(())
}

#[cfg(not(target_os = "linux"))]
fn main() {
    println!("So far, only Linux systems are supported.");
}