# Data Hook
一个轻量级的数据收集门面库,类似于 `log` crate 的设计理念。
`data_hook` crate 提供了一个简单的数据收集 API,它抽象了实际的数据处理实现。库可以使用此 crate 提供的数据收集 API,而使用者可以选择最适合其用例的收集器实现。
如果没有选择收集器实现,门面会回退到"无操作"实现,忽略所有数据收集请求。在这种情况下,开销非常小——只是一个整数加载、比较和跳转。
## 特性
- **简单易用**:只需一个 `data_hook!` 宏即可收集数据
- **零依赖**:核心库没有外部依赖
- **高性能**:未设置收集器时开销极小
- **可插拔**:通过 `Collect` trait 支持自定义收集器
- **类型安全**:编译时保证类型安全
## 基本用法
### 1. 在库中使用 data_hook
```rust
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);
}
```
### 2. 实现自定义收集器
```rust
use data_hook::{Collect, Record};
struct MyCollector;
impl Collect for MyCollector {
fn collect(&self, record: &Record) {
println!("[{}] {}", record.category, record.data);
}
fn flush(&self) {
// 可选:刷新缓冲的数据
}
}
```
### 3. 设置全局收集器
```rust
use data_hook::set_collector;
fn main() {
static COLLECTOR: MyCollector = MyCollector;
set_collector(&COLLECTOR);
// 现在所有的 data_hook! 调用都会使用 MyCollector
}
```
## 示例
### 简单的打印收集器
运行简单示例:
```bash
cargo run --example simple
```
这个示例展示了如何创建一个简单的收集器,将数据打印到标准输出。
### 文件收集器
运行文件收集器示例:
```bash
cargo run --example file_collector
```
这个示例展示了如何实现一个文件收集器,将不同类别的数据写入不同的 JSON Lines 文件。
## API 文档
### `data_hook!` 宏
主要的数据收集宏。
```rust
data_hook!(category, format_string, args...)
```
- `category`: 数据类别,用于标识数据类型
- `format_string`: 格式化字符串,类似 `println!`
- `args...`: 格式化参数
### `Record` 结构体
```rust
pub struct Record {
pub category: String, // 数据类别
pub data: String, // 数据内容
}
```
### `Collect` Trait
```rust
pub trait Collect: Send + Sync {
fn collect(&self, record: &Record);
fn flush(&self) {} // 可选实现
}
```
### `set_collector` 函数
```rust
pub fn set_collector(collector: &'static dyn Collect)
```
设置全局数据收集器。应该在程序开始时调用一次。
## 许可证
本项目采用 MIT 或 Apache-2.0 双重许可证。