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。