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

本软件按"原样"提供,不作任何明示或暗示的保证。在任何情况下,作者均不对因使用本软件而产生的任何损害承担责任。

允许任何人出于任何目的(包括商业应用)使用本软件,并可自由修改和重新分发,但须遵守以下限制:

  1. 不得歪曲本软件的来源;不得声称您编写了原始软件。如果在产品中使用本软件,在产品文档中注明将不胜感激,但不是必须的。

  2. 修改后的源代码版本必须明确标记为修改版本,且不得被歪曲为原始软件。

  3. 不得从任何源代码分发中删除或更改本通知。

修正

我,@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'

在控制台应用中查看:

  1. 打开"控制台"应用
  2. 在搜索栏中输入您的子系统标识符(如:com.example.myapp)
  3. 使用分类和级别过滤器细化搜索结果

性能建议

  1. 避免频繁的调试日志:在生产环境中适当调整日志级别
  2. 使用结构化数据:利用os_log的结构化日志功能提高查询效率
  3. 合理使用分类:为不同的功能模块创建适当的分类

注意事项

  • 该库仅支持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", "应用程序即将退出");
}
回到顶部