Rust日志处理库hyperlane-log的使用,hyperlane-log提供高性能跨链应用日志记录与分析功能

Rust日志处理库hyperlane-log的使用

hyperlane-log简介

hyperlane-log是一个高性能的Rust日志库,支持同步和异步日志记录功能。它提供error、info和debug三种标准日志级别,并允许用户自定义日志处理方式和文件存储路径。该库特别适合需要高效日志处理的跨链应用场景。

核心特性

  • 支持日志轮转功能,当日志文件达到指定大小时自动创建新文件
  • 提供同步和异步两种写入模式
  • 异步模式使用Tokio的异步通道实现高效缓冲
  • 支持自定义日志格式和存储路径
  • 可灵活配置日志文件大小限制

安装方法

在Rust项目中添加依赖:

cargo add hyperlane-log

日志文件结构

日志文件按以下结构组织:

指定目录/
  ├── error/       # 错误日志
  ├── info/        # 信息日志
  └── debug/       # 调试日志

每个子目录下按日期创建文件夹,日志文件命名格式为timestamp.index.log

基础用法示例

同步日志记录

use hyperlane_log::*;

// 初始化日志实例,设置日志目录和单个文件大小限制(1MB)
let log: Log = Log::new("./logs", 1_024_000);

// 记录错误日志
log.error("Payment failed", |error| {
    format!("Transaction error: {:?}\n", error)
});

// 记录信息日志  
log.info("New block received", |info| {
    format!("Block info: {:?}\n", info)
});

// 记录调试日志
log.debug("Parsing payload", |debug| {
    format!("Debug data: {:#?}\n", debug)
});

异步日志记录

use hyperlane_log::*;

let log: Log = Log::new("./async_logs", 1_024_000);

// 异步记录错误日志
log.async_error("Async error occurred", |error| {
    format!("[ASYNC] Error detail: {:?}\n", error)
}).await;

// 异步记录信息日志
log.async_info("Node syncing", |info| {
    format!("[ASYNC] Sync status: {:?}\n", info)
}).await;

完整示例代码

下面是一个结合同步和异步日志记录的完整示例:

use hyperlane_log::*;
use tokio::runtime::Runtime;

fn main() {
    // 同步日志示例
    let sync_log = Log::new("./sync_logs", 1_024_000);
    
    // 记录跨链交易错误
    sync_log.error("Cross-chain TX failed", |err| {
        format!("[ERROR] {:?}\n", err)
    });
    
    // 记录区块高度信息
    sync_log.info("Current block height", |info| {
        format!("[INFO] Height: {:?}\n", info)
    });

    // 异步日志示例
    Runtime::new().unwrap().block_on(async {
        let async_log = Log::new("./async_logs", 1_024_000);
        
        // 异步记录智能合约事件
        async_log.async_info("Contract event emitted", |event| {
            format!("[ASYNC] Event: {:?}\n", event)
        }).await;
        
        // 异步记录调试信息
        async_log.async_debug("Decoding message", |msg| {
            format!("[ASYNC] Message: {:#?}\n", msg)
        }).await;
    });
}

高级配置

禁用日志记录

use hyperlane_log::*;

// 使用DISABLE_LOG_FILE_SIZE禁用日志记录
let disabled_log = Log::new("./logs", DISABLE_LOG_FILE_SIZE);

自定义日志处理

log.info("Custom format", |data| {
    // 自定义日志格式
    let timestamp = chrono::Local::now();
    format!("[{}] Custom log: {}\n", timestamp, data)
});

注意事项

  1. 异步日志记录需要在异步上下文中使用
  2. 确保日志目录有写入权限
  3. 合理设置日志文件大小以避免磁盘空间耗尽

贡献与支持

该库采用MIT开源协议,欢迎通过提交issue或PR参与贡献。具体联系方式请参考项目文档。


1 回复

Rust日志处理库hyperlane-log的使用指南

介绍

hyperlane-log是一个专为高性能跨链应用设计的Rust日志记录与分析库。它提供了跨链环境下的结构化日志记录能力,特别适合需要监控和分析多链交互的分布式应用场景。

主要特性

  • 跨链日志统一记录
  • 高性能异步日志处理
  • 结构化日志输出
  • 支持多种日志级别
  • 内置跨链事务追踪ID
  • 可扩展的日志传输后端

安装

在Cargo.toml中添加依赖:

[dependencies]
hyperlane-log = "0.3"

完整示例demo

下面是一个完整的hyperlane-log使用示例,展示了从初始化到各种日志记录方式的完整流程:

use hyperlane_log::{
    Logger, LogConfig, LogProcessor, LogRecord, 
    info, error, warn, debug, trace,
    with_transaction_context, TransactionContext
};
use log::info as log_info;
use std::future::Future;

// 自定义日志处理器
struct MyLogProcessor;

impl LogProcessor for MyLogProcessor {
    fn process(&self, record: LogRecord) -> impl Future<Output = ()> + Send {
        async move {
            // 这里可以添加自定义日志处理逻辑
            // 例如发送到数据库或远程服务器
            println!("[自定义处理器] 收到日志: {:?}", record);
        }
    }
}

// 初始化日志系统
async fn init_logging() {
    let config = LogConfig::default()
        .with_chain_id("ethereum")  // 设置当前链ID
        .with_level(log::LevelFilter::Debug)  // 日志级别
        .with_console_output(true)  // 输出到控制台
        .with_file_output("app.log")  // 输出到文件
        .with_processor(Box::new(MyLogProcessor))  // 添加自定义处理器
        .with_max_file_size(1024 * 1024 * 50);  // 最大文件大小50MB
    
    Logger::init(config).await.expect("日志初始化失败");
}

#[tokio::main]
async fn main() {
    // 初始化日志系统
    init_logging().await;
    
    // 记录不同级别的日志
    trace!("这是一个trace级别的日志");
    debug!("这是一个debug级别的日志");
    log_info!("这是一个常规info日志");
    warn!("这是一个警告日志");
    
    // 结构化日志记录
    info!(
        target: "cross_chain",
        transaction_id = "0x123abc",
        from_chain = "ethereum",
        to_chain = "polygon",
        amount = "100.5",
        "跨链转账已发起"
    );
    
    // 错误日志示例
    error!(
        target: "contract_execution",
        contract = "0x789def",
        method = "transfer",
        error = "insufficient balance",
        "合约执行失败"
    );
    
    // 使用跨链事务上下文
    let tx_ctx = TransactionContext::new()
        .with_transaction_id("tx_789xyz")
        .with_source_chain("binance")
        .with_target_chain("fantom");
    
    with_transaction_context(tx_ctx, || {
        info!("开始处理跨链事务");
        debug!("事务详情加载完成");
        warn!("Gas价格高于平均值");
        error!("事务处理遇到错误");
    }).await;
    
    // 确保所有日志都已刷新
    log::logger().flush();
}

示例说明

这个完整示例展示了:

  1. 自定义日志处理器的实现
  2. 日志系统的完整初始化配置
  3. 不同级别的日志记录方法
  4. 结构化日志记录
  5. 跨链事务上下文的使用
  6. 日志系统的刷新

性能优化建议

  1. 在生产环境中,可以将日志级别设置为Info或更高
  2. 对于高频日志,考虑使用批量处理的自定义日志处理器
  3. 在非关键路径上避免频繁调用flush()
  4. 对于调试目的,可以使用debug!trace!宏,它们会在release构建中被优化掉

hyperlane-log为复杂的跨链应用提供了灵活而强大的日志记录解决方案,帮助开发者更好地理解和调试分布式系统中的交互行为。

回到顶部