Rust log4rs 架構分析

語言: CN / TW / HK

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 the compound_policy :
    • compound : requires the compound_policy feature
      • Rollers
        • delete : requires the delete_roller feature
        • fixed_window : requires the fixed_window_roller feature
      • Triggers
        • size : requires the size_trigger feature

encoder

log4rs 的 encoder 負責將日誌記錄轉換成對應的輸出格式,appender 一般會包括 encoder,encoder 主要有兩種實現:

  • pattern : requires the pattern_encoder feature
  • json : requires the json_encoder feature

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

  1. log4rs/lib.rs