【Rust Web開發(fā)系列】使用tracing 記錄日志
記錄日志是我們開發(fā)過程中必不可少的一步寸莫,良好規(guī)范的日志有助于我們快速排查定位遇到的問題成箫;
添加依賴
...
[dependencies]
time = {version="0.3.36",features=["formatting", "parsing", "macros", "std", "local-offset"]}
tracing = "0.1.40"
tracing-appender = "0.2.3"
tracing-subscriber={version = "0.3.18",features = ["local-time", "time", "env-filter"]}
...
配置logger
配置日志級別
tracing-subscriber 通過EnvFilter過濾日志茂嗓,低于配置級別的日志不會顯示
use tracing_appender::{non_blocking::WorkerGuard, rolling};
use tracing_subscriber::{
fmt::{self,time::OffsetTime},
layer::SubscriberExt,
util::SubscriberInitExt,
EnvFilter,
Registry};
use time::{macros::format_description, UtcOffset};
fn init_logger()->WorkerGuard{
// 配置日志過濾器
let env_filter = EnvFilter::try_from_default_env()
.unwrap_or_else(|_| EnvFilter::new("info"));
// 配置日志時(shí)間格式
// 配置時(shí)區(qū)為東8區(qū)仅财,
let offset = UtcOffset::from_hms(8, 0, 0).unwrap_or(UtcOffset::UTC);
// 時(shí)間格式為 年-月-日 時(shí):分:秒 格式
let logger_time = OffsetTime::new(
offset,
format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"),
);
// 配置日志樣式
let format_layer = fmt::layer()
.with_file(true) // 在日志中添加當(dāng)前文件信息
.with_timer(logger_time.clone()) // 日志中配置時(shí)間格式
.pretty() // 增強(qiáng)日志可讀性
.with_writer(std::io::stdout);// 日志輸出到控制臺
// format_layer是配置顯示到終端的日志格式棚饵,
// 如果我們要同時(shí)輸出日志到文件里拍摇,使用tracing-appender是常用的做法
// tracing-appender 提供的rolling模塊亮钦,
// 可以配置日志的自動滾動周期,如下配置表示日志文件保存在logs目錄下充活,日志名稱為app.log+時(shí)間
let file_appender = rolling::daily("logs", "app.log");
let (non_blocking_appender, guard) = tracing_appender::non_blocking(file_appender);
// 配置輸出到文件的日志樣式
let file_layer = fmt::layer()
.with_file(true) //打印文件信息
.with_timer(logger_time) //打印時(shí)間
.with_ansi(false)// 很多文本編輯器對顏色的處理不好蜂莉,所以文件中禁用日志顏色
.with_writer(non_blocking_appender);// 新增文件writer
Registry::default()
.with(env_filter)
.with(format_layer)
.with(file_layer)
.init();
// 還記得這個(gè)guard變量么,這是一個(gè)守衛(wèi)混卵,生命周期需要貫穿整個(gè)主進(jìn)程映穗,所以我們在最后將他作為返回參數(shù)返回
guard
}
// 配置完成了,最后看看效果吧
fn main(){
// 初始化日志
let _guard = init_logger();
// 日志級別配置為 "info"幕随,所以debug級別的日志不會打印
tracing::debug!("debug");
tracing::info!("info");
tracing::warn!("warn");
tracing::error!("error");
}
效果展示