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 次
91KB
1K SLoC
quicklog
快速的单线程日志框架,对于大型结构体几乎比 tracing
和 delog
快 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