2 个版本
0.1.3 | 2023 年 5 月 25 日 |
---|---|
0.1.2 | 2023 年 5 月 25 日 |
#29 in #logging-framework
用于 quicklog
10KB
63 行
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 微秒 | 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
除非法律要求或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言和许可范围,请参阅许可证。