data_hook

Crates.iodata_hook
lib.rsdata_hook
version0.1.0
created_at2025-09-01 07:53:36.108404+00
updated_at2025-09-01 07:53:36.108404+00
descriptionA lightweight data collection facade
homepage
repository
max_upload_size
id1819259
size16,749
Realer Mason (AnlangA)

documentation

README

Data Hook

一个轻量级的数据收集门面库,类似于 log crate 的设计理念。

data_hook crate 提供了一个简单的数据收集 API,它抽象了实际的数据处理实现。库可以使用此 crate 提供的数据收集 API,而使用者可以选择最适合其用例的收集器实现。

如果没有选择收集器实现,门面会回退到"无操作"实现,忽略所有数据收集请求。在这种情况下,开销非常小——只是一个整数加载、比较和跳转。

特性

  • 简单易用:只需一个 data_hook! 宏即可收集数据
  • 零依赖:核心库没有外部依赖
  • 高性能:未设置收集器时开销极小
  • 可插拔:通过 Collect trait 支持自定义收集器
  • 类型安全:编译时保证类型安全

基本用法

1. 在库中使用 data_hook

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. 实现自定义收集器

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. 设置全局收集器

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 文件。

API 文档

data_hook!

主要的数据收集宏。

data_hook!(category, format_string, args...)
  • category: 数据类别,用于标识数据类型
  • format_string: 格式化字符串,类似 println!
  • args...: 格式化参数

Record 结构体

pub struct Record {
    pub category: String,  // 数据类别
    pub data: String,      // 数据内容
}

Collect Trait

pub 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 双重许可证。

Commit count: 0

cargo fmt