Rust日志记录库free_log_client的使用,高效灵活的日志客户端实现与集成

Rust日志记录库free_log_client的使用,高效灵活的日志客户端实现与集成

安装

在项目目录中运行以下Cargo命令:

cargo add free_log_client

或者在Cargo.toml中添加以下行:

free_log_client = "0.5.0"

基本使用示例

use free_log_client::{Logger, LogLevel};

fn main() {
    // 创建日志记录器实例
    let logger = Logger::new();
    
    // 记录不同级别的日志
    logger.log(LogLevel::Info, "Application started");
    logger.log(LogLevel::Debug, "Debugging information");
    logger.log(LogLevel::Warning, "This is a warning");
    logger.log(LogLevel::Error, "An error occurred");
    
    // 也可以使用便捷方法
    logger.info("User logged in");
    logger.debug(format!("Current value: {}", 42));
    logger.warn("Disk space low");
    logger.error("Failed to connect to database");
}

高级配置示例

use free_log_client::{Logger, LogLevel, LogConfig};
use std::path::PathBuf;

fn main() {
    // 创建自定义配置
    let config = LogConfig {
        log_file: Some(PathBuf::from("app.log")),  // 指定日志文件
        max_file_size: 10 * 1024 * 1024,          // 10MB最大文件大小
        max_backups: 5,                           // 保留5个备份文件
        log_to_console: true,                     // 同时在控制台输出
        min_log_level: LogLevel::Debug,           // 最低记录级别为Debug
    };
    
    // 使用配置初始化日志记录器
    let logger = Logger::with_config(config);
    
    // 记录日志
    logger.debug("Detailed debug information");
    logger.info("System initialized successfully");
    
    // 结构化日志记录
    logger.with_fields(vec![
        ("user_id", "12345"),
        ("action", "file_upload"),
    ]).info("User performed action");
}

异步日志记录示例

use free_log_client::{Logger, LogLevel};
use tokio::runtime::Runtime;

async fn async_task(logger: &Logger) {
    logger.info("Starting async task");
    // 模拟一些工作
    tokio::time::sleep(std::time::Duration::from_secs(1)).await;
    logger.info("Async task completed");
}

fn main() {
    let logger = Logger::new();
    let rt = Runtime::new().unwrap();
    
    rt.block_on(async {
        logger.info("Application started");
        
        let tasks = vec![
            async_task(&logger),
            async_task(&logger),
            async_task(&logger),
        ];
        
        futures::future::join_all(tasks).await;
        
        logger.info("All tasks completed");
    });
}

日志过滤示例

use free_log_client::{Logger, LogLevel, LogFilter};

fn main() {
    let logger = Logger::new()
        .with_filter(LogFilter::new()
            // 只记录来自特定模块的日志
            .allow_module("my_app::database")
            // 排除特定模块的调试日志
            .deny_level_for_module("my_app::network", LogLevel::Debug)
            // 设置全局最低日志级别
            .min_level(LogLevel::Info));
    
    // 这些日志会被记录
    logger.module("my_app::database").info("Connected to DB");
    logger.module("my_app::network").warn("Connection slow");
    
    // 这些日志不会被记录
    logger.module("my_app::network").debug("Packet received");
    logger.module("my_app::utils").info("Utility function called");
}

完整示例demo

下面是一个结合了上述所有功能的完整示例:

use free_log_client::{Logger, LogLevel, LogConfig, LogFilter};
use std::path::PathBuf;
use tokio::runtime::Runtime;

// 异步任务示例
async fn perform_async_operation(logger: &Logger, task_id: i32) {
    logger.info(&format!("Starting async task {}", task_id));
    tokio::time::sleep(std::time::Duration::from_millis(500)).await;
    logger.debug(&format!("Task {} in progress", task_id));
    tokio::time::sleep(std::time::Duration::from_millis(500)).await;
    logger.info(&format!("Async task {} completed", task_id));
}

fn main() {
    // 创建自定义配置
    let config = LogConfig {
        log_file: Some(PathBuf::from("demo.log")),
        max_file_size: 5 * 1024 * 1024,  // 5MB
        max_backups: 3,
        log_to_console: true,
        min_log_level: LogLevel::Debug,
    };
    
    // 初始化带过滤器的日志记录器
    let logger = Logger::with_config(config)
        .with_filter(LogFilter::new()
            .allow_module("demo::core")
            .deny_level_for_module("demo::network", LogLevel::Debug)
            .min_level(LogLevel::Info));
    
    // 同步日志记录
    logger.module("demo::core").info("Application starting");
    logger.module("demo::network").debug("This debug won't be logged"); // 会被过滤
    logger.module("demo::core").debug("Core debug information");
    
    // 结构化日志
    logger.with_fields(vec![
        ("version", "1.0.0"),
        ("environment", "production"),
    ]).info("System initialized");
    
    // 异步日志记录
    let rt = Runtime::new().unwrap();
    rt.block_on(async {
        let tasks = (1..=3).map(|i| perform_async_operation(&logger, i));
        futures::future::join_all(tasks).await;
        
        logger.module("demo::core").info("All async tasks completed");
    });
    
    // 错误日志示例
    match some_operation() {
        Ok(_) => logger.info("Operation succeeded"),
        Err(e) => logger.error(&format!("Operation failed: {}", e)),
    }
}

fn some_operation() -> Result<(), String> {
    // 模拟可能失败的操作
    Err("Something went wrong".to_string())
}

free_log_client是一个高效灵活的Rust日志记录库,支持多种日志级别、文件输出、异步记录和灵活的过滤配置。通过简单的API,开发者可以轻松集成到各种Rust项目中。


1 回复

Rust日志记录库free_log_client的使用指南

介绍

free_log_client是一个高效灵活的Rust日志客户端库,专为需要轻量级但功能强大的日志记录解决方案的应用程序设计。它提供了简单的API接口,同时支持高度自定义的日志配置和输出方式。

主要特性

  • 高性能异步日志记录
  • 多日志级别支持
  • 可定制的日志格式
  • 多种输出目标(控制台、文件、网络等)
  • 线程安全的实现

安装

在Cargo.toml中添加依赖:

[dependencies]
free_log_client = "0.3.0"

基本使用方法

1. 快速开始

use free_log_client::{Logger, LogLevel};

fn main() {
    // 创建默认配置的logger
    let logger = Logger::default();
    
    // 记录不同级别的日志
    logger.log(LogLevel::Info, "Application started");
    logger.log(LogLevel::Debug, "Debug information");
    logger.log(LogLevel::Error, "Something went wrong!");
}

2. 自定义配置

use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};

fn main() {
    // 创建自定义配置
    let config = LogConfig {
        level: LogLevel::Debug,  // 只记录Debug及以上级别的日志
        output: LogOutput::File("app.log".into()),  // 输出到文件
        format: Some("%t [%l] %m".into()),  // 自定义格式: 时间戳 [级别] 消息
        ..Default::default()
    };
    
    let logger = Logger::with_config(config);
    
    logger.log(LogLevel::Info, "Custom configuration initialized");
}

3. 多输出目标

use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};

fn main() {
    let config = LogConfig {
        level: LogLevel::Info,
        output: LogOutput::Multi(vec![
            LogOutput::Console,  // 输出到控制台
            LogOutput::File("app.log".into()),  // 同时输出到文件
        ]),
        ..Default::default()
    };
    
    let logger = Logger::with_config(config);
    
    logger.log(LogLevel::Warning, "This will appear in both console and file");
}

4. 异步日志记录

use free_log_client::{Logger, LogLevel};
use std::thread;

fn main() {
    let logger = Logger::default();
    
    // 在多个线程中使用logger
    let handles: Vec<_> = (0..5).map(|i| {
        let logger = logger.clone();
        thread::spawn(move || {
            logger.log(LogLevel::Info, &format!("Thread {} logging", i));
        })
    }).collect();
    
    for handle in handles {
        handle.join().unwrap();
    }
}

高级功能

自定义日志格式

支持以下占位符:

  • %t - 时间戳
  • %l - 日志级别
  • %m - 日志消息
  • %f - 文件名
  • %n - 行号
use free_log_client::{Logger, LogConfig};

let config = LogConfig {
    format: Some("[%t] %l @ %f:%n - %m".into()),
    ..Default::default()
};

let logger = Logger::with_config(config);

日志级别过滤

use free_log_client::{Logger, LogConfig, LogLevel};

let config = LogConfig {
    level: LogLevel::Warning,  // 只记录Warning及以上级别的日志
    ..Default::default()
};

let logger = Logger::with_config(config);

集成到现有项目

对于大型项目,建议创建一个全局可访问的logger实例:

use free_log_client::{Logger, LogLevel};
use lazy_static::lazy_static;

lazy_static! {
    pub static ref LOGGER: Logger = Logger::default();
}

fn some_function() {
    LOGGER.log(LogLevel::Debug, "Debugging some function");
}

fn main() {
    some_function();
    LOGGER.log(LogLevel::Info, "Main function completed");
}

性能建议

  1. 对于高频日志记录,使用Debug级别前检查是否启用:

    if logger.is_enabled(LogLevel::Debug) {
        logger.log(LogLevel::Debug, &expensive_to_compute_message());
    }
    
  2. 考虑使用LogOutput::Buffer模式进行批量写入以提高性能

  3. 对于生产环境,建议将日志级别设置为Info或更高

free_log_client提供了灵活而强大的日志记录功能,可以根据项目需求进行各种定制。通过合理的配置,可以在不牺牲性能的情况下获得详细的运行时信息。

完整示例代码

下面是一个综合使用free_log_client各种功能的完整示例:

// 引入必要的模块
use free_log_client::{Logger, LogConfig, LogLevel, LogOutput};
use lazy_static::lazy_static;
use std::thread;

// 全局logger实例
lazy_static! {
    static ref GLOBAL_LOGGER: Logger = Logger::with_config(LogConfig {
        level: LogLevel::Debug,
        output: LogOutput::Multi(vec![
            LogOutput::Console,
            LogOutput::File("application.log".into())
        ]),
        format: Some("[%t] %l - %m (%f:%n)".into()),
        ..Default::default()
    });
}

fn main() {
    // 使用全局logger记录启动信息
    GLOBAL_LOGGER.log(LogLevel::Info, "Application starting...");
    
    // 检查Debug级别是否启用
    if GLOBAL_LOGGER.is_enabled(LogLevel::Debug) {
        GLOBAL_LOGGER.log(LogLevel::Debug, "Debug information available");
    }
    
    // 多线程日志记录示例
    let handles: Vec<_> = (0..3).map(|i| {
        thread::spawn(move || {
            GLOBAL_LOGGER.log(LogLevel::Info, &format!("Thread {} started", i));
            
            // 模拟工作
            thread::sleep(std::time::Duration::from_millis(100));
            
            GLOBAL_LOGGER.log(LogLevel::Info, &format!("Thread {} completed", i));
        })
    }).collect();
    
    // 等待所有线程完成
    for handle in handles {
        handle.join().unwrap();
    }
    
    // 记录错误示例
    match some_operation() {
        Ok(_) => GLOBAL_LOGGER.log(LogLevel::Info, "Operation succeeded"),
        Err(e) => GLOBAL_LOGGER.log(LogLevel::Error, &format!("Operation failed: {}", e)),
    }
    
    GLOBAL_LOGGER.log(LogLevel::Info, "Application shutting down");
}

fn some_operation() -> Result<(), String> {
    // 模拟可能失败的操作
    if rand::random() {
        Ok(())
    } else {
        Err("Random failure occurred".to_string())
    }
}

这个完整示例展示了:

  1. 全局logger实例的创建和配置
  2. 多输出目标(控制台和文件)
  3. 自定义日志格式
  4. 多线程安全日志记录
  5. 日志级别检查
  6. 错误处理场景的日志记录

要运行此示例,需要在Cargo.toml中添加以下依赖:

[dependencies]
free_log_client = "0.3.0"
lazy_static = "1.4.0"
rand = "0.8.5"
回到顶部