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)
});
注意事项
- 异步日志记录需要在异步上下文中使用
- 确保日志目录有写入权限
- 合理设置日志文件大小以避免磁盘空间耗尽
贡献与支持
该库采用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();
}
示例说明
这个完整示例展示了:
- 自定义日志处理器的实现
- 日志系统的完整初始化配置
- 不同级别的日志记录方法
- 结构化日志记录
- 跨链事务上下文的使用
- 日志系统的刷新
性能优化建议
- 在生产环境中,可以将日志级别设置为
Info
或更高 - 对于高频日志,考虑使用批量处理的自定义日志处理器
- 在非关键路径上避免频繁调用
flush()
- 对于调试目的,可以使用
debug!
和trace!
宏,它们会在release构建中被优化掉
hyperlane-log为复杂的跨链应用提供了灵活而强大的日志记录解决方案,帮助开发者更好地理解和调试分布式系统中的交互行为。