Rust log4rs 架構分析
log4rs
是基於 Rust log
抽象的 logging API 的一個 log 庫實現,這個 log 框架具備高可配置的能力。
log4rs 基本配置物件
appender
log4rs 的 appender 就是用來配置在哪裡記錄日誌的,appender 有如下幾種實現:
-
console
: requires the
console_appender
feature. -
file
: requires the
file_appender
feature. -
rolling_file
: requires the
rolling_file_appender
feature and can be configured with thecompound_policy
:-
compound
: requires the
compound_policy
feature-
Rollers
-
delete
: requires the
delete_roller
feature -
fixed_window
: requires the
fixed_window_roller
feature
-
delete
: requires the
-
Triggers
-
size
: requires the
size_trigger
feature
-
size
: requires the
-
Rollers
-
compound
: requires the
encoder
log4rs 的 encoder 負責將日誌記錄轉換成對應的輸出格式,appender 一般會包括 encoder,encoder 主要有兩種實現:
filter
filter 跟 appender 是關聯在一起的用來控制哪些日誌會在關聯的 appender 中記錄,主要的實現:
-
threshold
: requires the
threshold_filter
feature
logger
每條日誌記錄都是針對特定的 logger,logger 通過 target 字串來做區分的,如下程式碼所示的日誌記錄巨集定義指定了 target:
#[macro_export] macro_rules! bpf_trace { ($($arg:tt)+) => ( if $crate::logging::handler::Handle::is_inited() { log::log!(target: "pangolind::bpf", log::Level::Trace, $($arg)+) } ) }
::
作為 target 字串的分隔符,用了指定 logger 的父子關係,log level 如果沒有指定則繼承父 logger 的配置,每個 logger 可以指定一個 appender 集合,root logger 是所有 logger 的祖先。
log4rs 配置示例
# Scan this file for changes every 30 seconds refresh_rate: 30 seconds appenders: # An appender named "stdout" that writes to stdout stdout: kind: console # An appender named "requests" that writes to a file with a custom pattern encoder requests: kind: file path: "log/requests.log" encoder: pattern: "{d} - {m}{n}" # Set the default logging level to "warn" and attach the "stdout" appender to the root root: level: warn appenders: - stdout loggers: # Raise the maximum log level for events sent to the "app::backend::db" logger to "info" app::backend::db: level: info # Route log events sent to the "app::requests" logger to the "requests" appender, # and *not* the normal appenders installed at the root app::requests: level: info appenders: - requests additive: false
log4rs 二次開發
log4rs 這個日誌庫有很強的配置能力,為 Rust 提供了非常靈活的 logging 能力。但是在使用過程中也發現了 log4rs 一些不足,主要是業務場景的支援方面有一些不足:
- 配置檔案格式適配,Rust 經常使用的 TOML 格式
- 預設配置支援
- 支援非同步多檔案日誌記錄
- 巨集定義支援,例如多 target 的巨集定義
我自己開發了一個 logging 模組,目前在公司內部使用不方便公開,後面有時間我打算搞一個開源版本,stay tune。
References
「其他文章」