#logging #log #run-time #changelog #replace #wrapper #log-level

alterable_logger

对 "log" 的轻量级封装,允许在运行时替换实际的日志实现

1 个稳定版本

1.0.0 2023年9月19日

#45 in #changelog

MPL-2.0 许可证

9KB

alterable_logger

这个包实现了一个对广泛使用的 "log" 包的轻量级封装,增加了在运行时替换正在使用的日志实现的功能。这允许在性能损失很小的情况下使用更多样化的日志功能。

运行时重新配置实现基于 Arc、ArcSwap 和 Box,因此这个包只支持 std 环境。

使用说明(来自 examples/usage/src/main.rs 的摘录)

use log::LevelFilter;
use simplelog::{SimpleLogger, Config};

fn main() {
    log::error!("You should not see this!");

    // Register a basic logger with maximum filter level warn
    let logger = SimpleLogger::new(LevelFilter::Warn, Config::default());
    alterable_logger::configure(LevelFilter::Error, logger);

    log::error!("You should see this!");
    log::warn!("But this is invisible!");

    // Change the log level to warning
    alterable_logger::set_max_level(LevelFilter::Warn);
    log::warn!("You should see this!");

    // Change the log level to info (this will be not visible as the logger does not support it)
    alterable_logger::set_max_level(LevelFilter::Info);
    log::info!("But this is invisible!");

    // Replace current logger with a logger that supports a more verbose logging
    let logger = SimpleLogger::new(LevelFilter::Info, Config::default());
    alterable_logger::set_boxed_logger(logger);
    log::info!("You should see this!");
}

提示

尽管 alterable_logger 支持更改日志实现,但它必须是应用程序的第一个注册的日志器。否则,日志注册将静默失败,第一个注册的日志器将保持为正在使用的日志器。

性能

日志设施是全局注册的,这使得在单个应用程序中针对 "log" 设施和 "alterable_logger" 进行性能分析变得困难。为了大致估计 alterable_logger 引入的性能损失,提供了两个示例应用程序。

以下是结果

Log profiling test program
--------------------------
Log info messages 1000000 times
Total operation time: 265876362ns
Operation time per cycle: 265ns
Alterable_logger profiling test program
---------------------------------------
Log info messages 1000000 times
Total operation time: 647119571ns
Operation time per cycle: 647ns

与默认日志器相比,alterable_logger 的间接引用和锁定增加了操作时间超过 2 倍。在实际应用程序中,这不应该很重要,因为大多数日志实现都执行 I/O 密集型操作,这些操作引入了更多开销。

依赖关系

~320KB