| Crates.io | data_hook |
| lib.rs | data_hook |
| version | 0.1.0 |
| created_at | 2025-09-01 07:53:36.108404+00 |
| updated_at | 2025-09-01 07:53:36.108404+00 |
| description | A lightweight data collection facade |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1819259 |
| size | 16,749 |
一个轻量级的数据收集门面库,类似于 log crate 的设计理念。
data_hook crate 提供了一个简单的数据收集 API,它抽象了实际的数据处理实现。库可以使用此 crate 提供的数据收集 API,而使用者可以选择最适合其用例的收集器实现。
如果没有选择收集器实现,门面会回退到"无操作"实现,忽略所有数据收集请求。在这种情况下,开销非常小——只是一个整数加载、比较和跳转。
data_hook! 宏即可收集数据Collect trait 支持自定义收集器use data_hook::data_hook;
fn some_function() {
data_hook!("user_action", "用户点击了按钮");
data_hook!("performance", "请求耗时 {} ms", 150);
let user_id = 12345;
data_hook!("user_action", "用户 {} 登录", user_id);
}
use data_hook::{Collect, Record};
struct MyCollector;
impl Collect for MyCollector {
fn collect(&self, record: &Record) {
println!("[{}] {}", record.category, record.data);
}
fn flush(&self) {
// 可选:刷新缓冲的数据
}
}
use data_hook::set_collector;
fn main() {
static COLLECTOR: MyCollector = MyCollector;
set_collector(&COLLECTOR);
// 现在所有的 data_hook! 调用都会使用 MyCollector
}
运行简单示例:
cargo run --example simple
这个示例展示了如何创建一个简单的收集器,将数据打印到标准输出。
运行文件收集器示例:
cargo run --example file_collector
这个示例展示了如何实现一个文件收集器,将不同类别的数据写入不同的 JSON Lines 文件。
data_hook! 宏主要的数据收集宏。
data_hook!(category, format_string, args...)
category: 数据类别,用于标识数据类型format_string: 格式化字符串,类似 println!args...: 格式化参数Record 结构体pub struct Record {
pub category: String, // 数据类别
pub data: String, // 数据内容
}
Collect Traitpub trait Collect: Send + Sync {
fn collect(&self, record: &Record);
fn flush(&self) {} // 可选实现
}
set_collector 函数pub fn set_collector(collector: &'static dyn Collect)
设置全局数据收集器。应该在程序开始时调用一次。
本项目采用 MIT 或 Apache-2.0 双重许可证。