日志信息
记录调试信息到控制台
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
便捷宏 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
使用 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"); }
使用自定义日志记录器记录信息
本实例实现一个打印到 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 系统日志
本实例实现将信息记录到 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."); }