Rust日志记录库tracing-oslog的使用,实现macOS系统日志(syslog)集成与高效追踪
Rust日志记录库tracing-oslog的使用,实现macOS系统日志(syslog)集成与高效追踪
这是一个用于Apple OS日志框架的tracing层。
活动用于处理跨度。
示例
use tracing_oslog::OsLogger;
let collector = tracing_subscriber::registry()
.with(OsLogger::new("moe.absolucy.test", "default"));
tracing::subscriber::set_global_default(collector).expect("failed to set global subscriber");
let number_of_yaks = 3;
// 这在任何跨度之外创建一个新事件
info!(number_of_yaks, "preparing to shave yaks");
let number_shaved = yak_shave::shave_all(number_of_yaks);
info!(
all_yaks_shaved = number_shaved == number_of_yaks,
"yak shaving completed."
);
完整示例代码
// 引入必要的依赖
use tracing_oslog::OsLogger;
use tracing_subscriber::prelude::*;
use tracing::{info, Level};
fn main() {
// 创建OSLogger实例,指定子系统标识符和类别
// "moe.absolucy.test" 是子系统标识符
// "default" 是日志类别
let os_logger = OsLogger::new("moe.absolucy.test", "default");
// 设置全局追踪订阅者
let collector = tracing_subscriber::registry()
.with(os_logger);
tracing::subscriber::set_global_default(collector)
.expect("failed to set global subscriber");
// 记录一个简单的事件
let number_of_yaks = 3;
info!(number_of_yaks, "preparing to shave yaks");
// 模拟一些处理逻辑
let number_shaved = simulate_yak_shaving(number_of_yaks);
// 记录另一个包含条件信息的事件
info!(
all_yaks_shaved = number_shaved == number_of_yaks,
"yak shaving completed."
);
}
// 模拟剃牦牛的函数
fn simulate_yak_shaving(count: i32) -> i32 {
info!("Starting to shave {} yaks", count);
// 模拟处理逻辑
count // 假设所有牦牛都被剃了
}
许可证
版权所有 © 2021 Lucy lucy@absolucy.moe
本软件按"原样"提供,不作任何明示或暗示的保证。在任何情况下,作者均不对因使用本软件而产生的任何损害承担责任。
允许任何人出于任何目的(包括商业应用)使用本软件,并可自由修改和重新分发,但须遵守以下限制:
-
不得歪曲本软件的来源;不得声称您编写了原始软件。如果在产品中使用本软件,在产品文档中注明将不胜感激,但不是必须的。
-
修改后的源代码版本必须明确标记为修改版本,且不得被歪曲为原始软件。
-
不得从任何源代码分发中删除或更改本通知。
修正
我,@Absolucy,完全允许在任何地方使用我的任何代码(包括本项目tracing-oslog的全部代码),无论采用何种许可证,用于训练旨在用于通用编程或代码分析的机器学习模型。
1 回复
Rust日志记录库tracing-oslog的使用指南
概述
tracing-oslog是一个专为macOS系统设计的Rust日志记录库,它提供了与macOS系统日志(syslog)的无缝集成。通过将tracing事件转发到macOS的os_log系统,开发者可以在控制台应用和系统日志中查看结构化日志信息。
主要特性
- 与tracing生态系统完全兼容
- 支持macOS系统日志结构化记录
- 自动日志级别映射
- 线程安全的日志记录
- 轻量级且高性能
安装方法
在Cargo.toml中添加依赖:
[dependencies]
tracing = "0.1"
tracing-oslog = "0.1"
tracing-subscriber = "0.3"
基本使用方法
1. 基本配置
use tracing_oslog::OsLogger;
use tracing_subscriber::prelude::*;
fn main() {
// 初始化日志记录器
let logger = OsLogger::new("com.example.myapp")
.with_category("general")
.with_level(tracing::Level::INFO);
tracing_subscriber::registry()
.with(logger)
.init();
// 记录日志
tracing::info!("应用程序已启动");
tracing::warn!("这是一个警告消息");
tracing::error!("发生了一个错误");
}
2. 多分类日志记录
use tracing_oslog::OsLogger;
fn setup_logging() {
let main_logger = OsLogger::new("com.example.myapp")
.with_category("main")
.with_level(tracing::Level::DEBUG);
let network_logger = OsLogger::new("com.example.myapp")
.with_category("network")
.with_level(tracing::Level::INFO);
tracing_subscriber::registry()
.with(main_logger)
.with(network_logger)
.init();
}
fn main() {
setup_logging();
tracing::debug!(category = "main", "调试详细信息");
tracing::info!(category = "network", "网络连接已建立");
}
3. 结构化日志记录
use tracing_oslog::OsLogger;
#[tokio::main]
async fn main() {
let logger = OsLogger::new("com.example.myapp")
.with_category("api")
.with_level(tracing::Level::INFO);
tracing_subscriber::registry().with(logger).init();
// 记录结构化数据
tracing::info!(
category = "api",
user_id = 12345,
endpoint = "/api/v1/users",
duration_ms = 42,
"API请求完成"
);
}
4. 自定义日志级别映射
use tracing_oslog::{OsLogger, OsLogLevel};
use tracing::Level;
fn setup_custom_logging() {
let logger = OsLogger::new("com.example.myapp")
.with_level_map(|level| match level {
Level::TRACE => OsLogLevel::Debug,
Level::DEBUG => OsLogLevel::Debug,
Level::INFO => OsLogLevel::Info,
Level::WARN => OsLogLevel::Default,
Level::ERROR => OsLogLevel::Error,
});
tracing_subscriber::registry().with(logger).init();
}
查看日志
在终端中查看日志:
# 查看实时日志
log stream --predicate 'subsystem == "com.example.myapp"'
# 查看特定分类的日志
log stream --predicate 'subsystem == "com.example.myapp" AND category == "network"'
# 查看错误级别的日志
log stream --predicate 'subsystem == "com.example.myapp" AND level >= 2'
在控制台应用中查看:
- 打开"控制台"应用
- 在搜索栏中输入您的子系统标识符(如:com.example.myapp)
- 使用分类和级别过滤器细化搜索结果
性能建议
- 避免频繁的调试日志:在生产环境中适当调整日志级别
- 使用结构化数据:利用os_log的结构化日志功能提高查询效率
- 合理使用分类:为不同的功能模块创建适当的分类
注意事项
- 该库仅支持macOS系统
- 需要macOS 10.12或更高版本
- 结构化字段支持基本数据类型(字符串、数字、布尔值)
通过tracing-oslog,您可以轻松地将Rust应用程序的日志集成到macOS的统一日志系统中,实现高效的日志管理和故障排查。
完整示例demo
// 引入必要的库
use tracing_oslog::{OsLogger, OsLogLevel};
use tracing_subscriber::prelude::*;
use tracing::Level;
#[tokio::main]
async fn main() {
// 配置主日志记录器
let main_logger = OsLogger::new("com.example.myapp")
.with_category("main")
.with_level(Level::DEBUG);
// 配置网络日志记录器
let network_logger = OsLogger::new("com.example.myapp")
.with_category("network")
.with_level(Level::INFO);
// 配置API日志记录器
let api_logger = OsLogger::new("com.example.myapp")
.with_category("api")
.with_level_map(|level| match level {
Level::TRACE => OsLogLevel::Debug,
Level::DEBUG => OsLogLevel::Debug,
Level::INFO => OsLogLevel::Info,
Level::WARN => OsLogLevel::Default,
Level::ERROR => OsLogLevel::Error,
});
// 初始化日志订阅器
tracing_subscriber::registry()
.with(main_logger)
.with(network_logger)
.with(api_logger)
.init();
// 记录不同分类的日志
tracing::debug!(category = "main", "应用程序启动中...");
tracing::info!(category = "main", "应用程序已成功启动");
tracing::info!(category = "network", "正在连接到服务器");
tracing::warn!(category = "network", "网络连接较慢");
// 记录结构化日志
tracing::info!(
category = "api",
user_id = 12345,
endpoint = "/api/v1/users",
method = "GET",
status_code = 200,
duration_ms = 150,
"API请求处理完成"
);
tracing::error!(
category = "api",
user_id = 67890,
endpoint = "/api/v1/posts",
method = "POST",
status_code = 500,
error_msg = "数据库连接失败",
"API请求处理失败"
);
// 模拟应用程序运行
simulate_application();
}
fn simulate_application() {
tracing::info!(category = "main", "应用程序正常运行中");
// 模拟一些业务逻辑
for i in 0..5 {
tracing::debug!(category = "main", iteration = i, "处理第{}次迭代", i);
}
tracing::info!(category = "main", "应用程序即将退出");
}