十、Rust 集成日志工具 Rust 日志工具大体有 log、env_logger 和 log、log4rs 两套方案,所以看起来 log 只是日志 特性,相当于 Java 中的接口,另外两个是实现。 对比后发现,log4rs 的使用方式更灵活,如可基于代码来配置,或基于 yaml、toml 文件来声明等。 无论使用哪种实现,我们在工作中,都是面向的 log 特性来编码。
Cargo.toml
[package] name = "..." edition = "2018" ... [dependencies] log4rs = "1.0.0-alpha-2" # log4rs for log ...根据项目首页的介绍,使用 log4rs 需要提供 log4rs.yaml 配置文件,并通过一行代码来初始化 log 引擎。
log4rs.yaml
refresh_rate: 30 seconds appenders: stdout: kind: console encoder: pattern: "{d(%Y-%m-%d %H:%M:%S)} {h({l})} [{M}] - {m}{n}" root: level: debug appenders: - stdout为使项目界面保持简单,我们将这行初始化,放在了一个项目全局启动的地方。 boot/mod.rs
pub fn start() { log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); boot::db::init_db_pool() // TODO ... }Log4rs 的 pattern 支持以下内容:
d,data 日期,默认为 ISO 9601 格式,可以通过 {d(%Y-%m-%d %H:%M:%S)} 这种方式改变日期格式l,log 级别h,高亮显示,debug 灰,info 绿,warn 黄,error 红L,line log消息所在行数M,Module log 消息所在模块m,message log 消息n,具体平台的换行符X,mdc 映射诊断环境P,pid - The current process id.t,target - The target of the log message. 可能与 Module 相同T,thread - The name of the current thread. 线程名称I,thread_id - The ID of the current thread. 线程 ID将前面的章节的 数据源 初始化部分,改为用 日志 输出。
pub fn init_db_pool() { if let Some(db) = &crate::boot::global().postgres { let pool = PgPoolOptions::new() .min_connections(db.min) .max_connections(db.max) .connect_lazy(&db.dsn).unwrap(); assert!(POSTGRES_POOL.set(pool).is_ok()); log::info!("DataSource {} {} ~ {}", db.dsn, db.min, db.max) } }以 Mac + Clion 为例,Control + D,以 debug 模式启动服务。
2020-11-18 17:09:09 INFO [favorites::boot::db] - DataSource postgres://username:password@ip:5432/postgres 5 ~ 15 2020-11-18 17:09:09 INFO [actix_server::builder] - Starting 8 workers 2020-11-18 17:09:09 INFO [actix_server::builder] - Starting "actix-web-service-0.0.0.0:8080" service on 0.0.0.0:8080完事儿 ~