3 个版本
0.1.3 | 2023 年 5 月 25 日 |
---|---|
0.1.2 | 2023 年 5 月 25 日 |
0.1.1 | 2023 年 5 月 25 日 |
#612 in 调试
用于 quicklog
10KB
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.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