Rust日志库性能压测 — log4rs + tracing + tklog


简介:
log4rs 是 一个功能丰富的日志库,它的设计主要围绕灵活的配置管理和多种日志输出形式,提供了多种后端和日志格式选项。
tracing 是 一个强大的事件跟踪和日志库,它采用结构化日志记录,可以在复杂系统中精确跟踪事件的发生时间和上下文信息。
tklog 是一个更加轻量化高性能日志库。设计的核心目标是高性能和低延迟,适用于对日志性能要求极高的场景。


以下是 压测程序

impl FormatTime for ChronoLocal {
    fn format_time(&self, w: &mut Writer<'_>) -> std::fmt::Result {
        write!(w, "{}", Local::now().format("%Y-%m-%d %H:%M:%S"))
    }
}

//tracing初始化
fn tracing_init() -> Result<(), Box<dyn std::error::Error>> {
    let file = File::create("tracing_bench.log")?;
    let subscriber = FmtSubscriber::builder().with_max_level(Level::INFO).with_writer(file).with_ansi(false).with_timer(ChronoLocal).with_file(true).with_line_number(true).finish();

    tracing::subscriber::set_global_default(subscriber)?;
    Ok(())
}

//tklog初始化
fn tklog_init() {
    LOG.set_console(false).set_cutmode_by_size("tklog_bench.log", 500 << 20, 10, false);
}

//log4rs初始化
fn log4rs_init(){
    log4rs::init_file("benches/log4rs.yaml", Default::default()).unwrap();
}

fn testtklog() {
    tklog::debug!("aaaaaaaaaaaaaaaaaaabbbbbbbbbbb>>>>>>>>", 1, 2, 3);
}

fn tklog_benchmark(c: &mut Criterion) {
    tklog_init();
    c.bench_function("tklog_benchmark", |b| b.iter(|| testtklog()));
}

fn testlog4rs() {
    log::debug!("aaaaaaaaaaaaaaaaaaaaaaaaaabb{},{},{}", 1, 2, 3);
}

fn log4rs_benchmark(c: &mut Criterion) {
    log4rs_init()
    c.bench_function("log4s_benchmark", |b| b.iter(|| testlog4rs()));
}

fn test_tracing() {
    tracing::info!("aaaaaaaaaaaaaaaabb{},{},{}", 1, 2, 3);
}



压测结果:


数据分析:

1. log4rs

  • 平均耗时在 4.17 µs 至 4.33 µs 之间。
  • 在多次测试中,log4rs的性能变化较为一致,性能改进主要集中在几个特定的测试中,如在 [-6.8293% -5.4761% -4.1493%] 的测试中表现出显著的性能提升。
  • 在一些测试中,性能无显著变化或仅有小幅度下降。
  • 结论log4rs 在整体上表现相对稳定,并且有一定的优化空间,性能相对较好,但仍略高于其他库的延迟。

2. tracing

  • 平均耗时在 4.14 µs 至 4.36 µs 之间,和 log4rs 相差不大。
  • 多次测试中,tracing 的性能变化较为温和,基本处于无明显变化的状态。尽管在部分测试中表现出轻微性能下降,但其整体稳定性较高。
  • 在某些测试中,例如 [-10.090% -7.9332% -5.8143%],有显著的性能提升,表明 tracing 具有提升的可能。
  • 结论tracing 的性能与 log4rs 相似,在部分场景下甚至略优,但大部分测试未见显著的性能变化。

3. tklog

  • 平均耗时在 2.26 µs 至 2.43 µs 之间。
  • 在多次测试中,tklog 明显优于 log4rstracing,其耗时约为其他两个库的一半。
  • 性能变化也表现出较大的提升,例如在 [-21.147% -18.162% -15.360%] 测试中,tklog的性能提升显著,几乎改善了 20% 左右的性能。这表明在不断优化的过程中,tklog 能够保持较低的延迟。
  • 结论tklog 在性能上具有显著优势,尤其在日志处理性能上表现出色,延迟显著低于 log4rstracing

性能稳定性

通过观察每个库的 outliers(离群值) 数量,可以分析日志库在性能上的波动情况。离群值是指性能表现异常的测量点,反映出系统在运行时是否有突发的性能抖动或波动。

  • log4rs 的离群值比例较高,通常在 4% 至 19% 之间,显示其性能波动较大,尤其是一些高严重度的 outliers 可能表明在某些场景下性能下降较明显。
  • tracing 的离群值比例也较高,通常在 8% 至 15% 左右,显示出类似的性能波动性,尤其在高并发或复杂日志场景中,性能可能存在不稳定现象。
  • tklog 的离群值相对较少,通常在 6% 至 11% 之间,说明它的性能更加稳定,抖动较小。这在需要长时间稳定运行的高性能系统中是一个优势。

总结

  • tklog 的日志处理效率几乎是 log4rs tracing 的两倍,平均耗时仅为其他库的一半。同时表现出更高的稳定性和优化潜力。其离群值较少,性能抖动较小,适合高性能和高实时性场景
  • log4rstracing 在性能上相差不大,都表现出一定的稳定性和可靠性,但在高性能要求的场景中可能略显逊色。
  • 如果你的应用对性能有极高要求,tklog 会是一个很好的选择;而如果需要更成熟的特性和更广泛的生态支持,log4rstracing 也值得考虑。