4 个版本

0.1.18 2023 年 5 月 25 日
0.1.17 2023 年 5 月 25 日
0.1.16 2023 年 5 月 25 日
0.1.15 2023 年 5 月 25 日

#323调试

每月 下载 23

Apache-2.0

91KB
1K SLoC

quicklog

快速的单线程日志框架,对于大型结构体几乎比 tracingdelog 快 200 倍。

支持标准日志宏,如 trace!debug!info!warn!error!

刷新延迟到调用 flush!() 宏时。

目标

  • 延迟格式化
  • 延迟 I/O
  • 低调用点延迟

虽然 tracing 是一个流行的用于事件跟踪的库,并且在它所做的事情上做得很好,但 quicklog 优化了低调用点延迟,通过在单独的线程上处理格式化和 I/O,从而远离热点路径来支付成本。

安装

使用 Cargo 安装

cargo add quicklog

添加到 Cargo.toml

# Cargo.toml
[dependencies]
quicklog = "0.1.18"
# ...

使用方法

快速开始

use quicklog::{info, init, flush};

fn main() {
    // initialise required resources, called near application entry point
    init!();

    // adds item to logging queue
    info!("hello world");

    let some_var = 10;
    // variables are passed by copy
    info!("value of some_var: {}", some_var);

    // flushes everything in queue
    flush!();
}

使用 Serialize

为了避免复制大型结构体,你可以实现 Serialize 特性。

这允许你将结构体的特定部分复制到循环字节缓冲区中,并通过提供一个从字节缓冲区解码你的结构体的函数来避免复制其余部分。

有关完整示例,请参阅 ~/quicklog/benches/logger_benchmark.rs

use quicklog::serialize::{Serialize, Store};

struct SomeStruct {
    num: i64
}

impl Serialize for SomeStruct {
   fn encode(&self, write_buf: &'static mut [u8]) -> Store { /* some impl */ }
   fn buffer_size_required(&self) -> usize { /* some impl */ }
}

fn main() {
    let s = SomeStruct { num: 1_000_000 };
    info!("some struct: {}", ^s);
}

使用不同的刷新机制

use quicklog_flush::stdout_flusher::StdoutFlusher;
use quicklog::{info, init, flush, with_flush_into_file, with_flush};

fn main() {
    init!();

    // flush into stdout
    with_flush!(StdoutFlusher);

    // item goes into logging queue
    info!("hello world");

    // flushed into stdout
    flush!()

    // flush into a file path specified
    with_flush_into_file!("logs/my_log.log");

    info!("shave yaks");

    // flushed into file
    flush!();
}

基准测试

在 2020 年 16 核 M1 Macbook Air 上(16 GB RAM)进行测量。

记录包含 10 个大型结构体的向量的结构体

记录器 下限 估计 上限
quicklog 103.76 纳秒 104.14 纳秒 104.53 纳秒
tracing 22.336 微秒 22.423 微秒 22.506 微秒
delog 21.528 微秒 21.589 微秒 21.646 微秒

记录包含 100 个数组元素的单个结构体

记录器 下限 估计 上限
quicklog 61.399 纳秒 62.436 纳秒 63.507 纳秒
tracing 2.6501 微秒 2.6572 微秒 2.6646 微秒
delog 2.7610 微秒 2.7683 微秒 2.7761 微秒

记录包含原始数据的小型结构体

记录器 下限 估计 上限
quicklog 28.561 纳秒 28.619 纳秒 28.680 纳秒
tracing 627.79 微秒 629.91 微秒 632.06 微秒
delog 719.54 微秒 721.19 微秒 722.96 微秒

贡献 & 支持

我们欢迎贡献和请求!

请在 Github Issues 上发布您的错误报告或功能请求。

路线图

  • [] 添加单线程和多线程变体
  • [] 尝试在递归中移除嵌套 lazy_format
  • [] 检查每行日志中数据的复制次数,并可能减少它
  • [] 审查不安全代码的使用
  • [] 基准测试多线程性能
  • [] 静态断言 Level 和 LevelFilter 中的字符串大小相同

作者及致谢

Zack Ng,Tien Dat Nguyen,Michiel van Slobbe,Dheeraj Oswal

软件包

参考

许可证

版权所有 2023 Grasshopper Asia

遵循 Apache 许可证 2.0 版(“许可证”);除非您遵守许可证,否则不得使用此文件。您可以在以下位置获得许可证副本:

http://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则在许可证下分发的软件按照“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证。

依赖

~2.3–4.5MB
~73K SLoC