简介:
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);
}
log4rs
的性能变化较为一致,性能改进主要集中在几个特定的测试中,如在 [-6.8293% -5.4761% -4.1493%]
的测试中表现出显著的性能提升。log4rs
在整体上表现相对稳定,并且有一定的优化空间,性能相对较好,但仍略高于其他库的延迟。log4rs
相差不大。tracing
的性能变化较为温和,基本处于无明显变化的状态。尽管在部分测试中表现出轻微性能下降,但其整体稳定性较高。[-10.090% -7.9332% -5.8143%]
,有显著的性能提升,表明 tracing
具有提升的可能。tracing
的性能与 log4rs
相似,在部分场景下甚至略优,但大部分测试未见显著的性能变化。tklog
明显优于 log4rs
和 tracing
,其耗时约为其他两个库的一半。[-21.147% -18.162% -15.360%]
测试中,tklog
的性能提升显著,几乎改善了 20% 左右的性能。这表明在不断优化的过程中,tklog
能够保持较低的延迟。tklog
在性能上具有显著优势,尤其在日志处理性能上表现出色,延迟显著低于 log4rs
和 tracing
。通过观察每个库的 outliers(离群值) 数量,可以分析日志库在性能上的波动情况。离群值是指性能表现异常的测量点,反映出系统在运行时是否有突发的性能抖动或波动。