#logging-framework #logger #logging #quicklog

quicklog-flush

包含 quicklog 日志记录器的 Flusher

2 个版本

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

#29 in #logging-framework


用于 quicklog

Apache-2.0 许可

10KB
63

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 微秒 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 License 2.0(以下简称“许可证”);除非法律要求或书面同意,否则不得使用此文件,除非遵守许可证。您可以在以下地址获取许可证副本:

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

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

无运行时依赖