#logging-framework #logger #logging #quicklog

quicklog-clock

包含快速日志记录器的时钟

3 个版本

0.1.3 2023 年 5 月 25 日
0.1.2 2023 年 5 月 25 日
0.1.1 2023 年 5 月 25 日

#612 in 调试


用于 quicklog

Apache-2.0

10KB

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.15"
# ...

使用方法

快速入门

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 µs 2.7761 µs

记录包含基本类型的小结构体

记录器 下限 估计 上限
quicklog 28.561 ns 28.619 ns 28.680 ns
tracing 627.79 µs 629.91 µs 632.06 µs
delog 719.54 µs 721.19 µs 722.96 µs

贡献与支持

我们欢迎贡献和请求!

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

路线图

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

作者与致谢

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

存储库

参考文献

许可证

版权所有 2023 Grasshopper Asia

根据Apache License 2.0(“许可证”)许可;除非根据许可证规定或书面同意,否则不得使用此文件。您可以在以下位置获得许可证副本:

http://www.apache.org/licenses/LICENSE-2.0

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

依赖项

~1.7–3.5MB
~60K SLoC