面试题答案
一键面试1. println!
宏
- 特点:简单直接,不需要引入额外的依赖。但是功能有限,只能输出到标准输出,没有日志级别控制,输出格式固定且不可定制。
- 开发阶段调试示例:
fn main() {
let num = 10;
println!("The value of num is: {}", num);
}
- 应用场景选择:在开发初期,快速查看变量值或程序执行流程时使用。例如在函数内部临时打印一些中间计算结果。
2. log
与 env_logger
结合
- 特点:
log
库:提供统一的日志记录接口,抽象了不同日志后端的差异,方便在不同日志系统间切换。env_logger
:是一个简单的日志后端,基于环境变量配置日志级别,支持常见的日志级别(debug
,info
,warn
,error
),可以将日志输出到标准输出。
- 开发阶段调试示例:
// 在Cargo.toml中添加依赖
// [dependencies]
// log = "0.4"
// env_logger = "0.9"
use log::{debug, info, warn, error};
fn main() {
env_logger::init();
let num = 10;
debug!("The value of num for detailed debug: {}", num);
info!("The value of num for general info: {}", num);
warn!("There might be an issue with num: {}", num);
error!("A serious error occurred with num: {}", num);
}
通过设置环境变量 RUST_LOG=debug
可看到所有级别的日志,RUST_LOG=info
则只看到 info
及更高级别日志。
- 生产环境监控示例:在生产环境设置
RUST_LOG=info
或RUST_LOG=warn
,减少日志量,只关注重要信息和潜在问题。
3. log
与 fancy_logger
结合
- 特点:
fancy_logger
提供了更美观的日志输出格式,相比env_logger
,它对日志的格式化更丰富,例如带有时间戳、日志级别颜色区分等,同样基于log
统一接口。 - 开发阶段调试示例:
// 在Cargo.toml中添加依赖
// [dependencies]
// log = "0.4"
// fancy_logger = "0.4"
use log::{debug, info, warn, error};
fn main() {
fancy_logger::init().unwrap();
let num = 10;
debug!("The value of num for detailed debug: {}", num);
info!("The value of num for general info: {}", num);
warn!("There might be an issue with num: {}", num);
error!("A serious error occurred with num: {}", num);
}
- 应用场景选择:在开发阶段,希望有更清晰美观的日志输出,方便查看和分析日志时使用。
4. log
与 log4rs
结合
- 特点:
- 功能强大,支持复杂的日志配置,如将日志输出到文件、按日期滚动日志文件、自定义日志格式等。
- 基于
log
统一接口,可灵活配置不同的日志级别和输出目标。
- 生产环境监控示例:
// 在Cargo.toml中添加依赖
// [dependencies]
// log = "0.4"
// log4rs = "0.14"
use log::{info, error};
use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Config, Root};
use log4rs::encode::pattern::PatternEncoder;
fn main() {
let logfile = FileAppender::builder()
.encoder(Box::new(PatternEncoder::new("{d} - {l} - {m}{n}")))
.build("app.log")
.unwrap();
let config = Config::builder()
.appender(Appender::builder().name("logfile").build(logfile))
.build(Root::builder().appender("logfile").build(log::LevelFilter::Info))
.unwrap();
log4rs::init_config(config).unwrap();
info!("This is an info log in production.");
error!("This is an error log in production.");
}
- 应用场景选择:在生产环境中,需要对日志进行精细化管理,如长期保存日志、按不同级别分类存储日志等场景下使用。