log-full

Crates.iolog-full
lib.rslog-full
version0.0.1
created_at2025-08-14 13:00:06.197089+00
updated_at2025-08-14 13:00:06.197089+00
descriptionA simple, asynchronous log library
homepage
repository
max_upload_size
id1794840
size87,598
(dexcodehub)

documentation

README

log-full -- simple async log library

简单异步日志库,基于log库


项目地址

特性
  • 基于官方log库实现,切换容易

  • 支持分类设置日志级别

  • 终端使用 ansi color 输出日志

  • 支持同步与异步日志方式

  • 异步日志可选线程模式及tokio的协程模式

  • 支持输出到控制台与文件

  • 日志文件支持设置最大长度

第三方依赖
  • log
  • parking_lot
  • crossbeam
  • time [optional]
  • chrono [optional]

添加依赖

cargo add log-full

使用
use std::{fs, path::Path, thread, time::Duration};

fn main() {
    // 日志配置
    let log_level = "trace";  // 改为trace级别以显示所有日志
    let log_max = "100k";
    let log_file = "app.log";
    let log_dir = "logs";
    let enable_console_log = true;
    
    // 验证配置参数
    log_full::parse_level(log_level).unwrap();
    log_full::parse_size(log_max).unwrap();

    // 构建日志文件路径
    let log_file_path = if log_dir.is_empty() {
        log_file.to_string()
    } else {
        // 确保日志目录存在
        if let Err(e) = fs::create_dir_all(log_dir) {
            eprintln!("Failed to create log directory {}: {}", log_dir, e);
        }
        Path::new(log_dir)
            .join(log_file)
            .to_string_lossy()
            .to_string()
    };

    // 配置日志 - 展示自定义配置选项
    let builder = log_full::Builder::new()
        .level_str(log_level)
        .unwrap()
        .log_file(log_file_path)
        .log_file_max_str(log_max)
        .unwrap()
        .use_console(enable_console_log)
        .use_async(true)
        .show_process_id(true)    // 显示进程ID
        .show_thread_info(true)   // 显示线程信息
        .show_module_path(true)   // 显示模块路径
        .highlight_keywords(vec!["ERROR".to_string(), "WARN".to_string(), "重要".to_string(),"关键词".to_string(),"线程".to_string()]);  // 设置关键词高亮

    builder.builder().unwrap();

    println!("=== 日志配置完成,开始测试不同配置选项 ===");
    
    // 测试默认配置(显示所有信息)
    println!("\n--- 测试1: 默认配置(显示所有信息) ---");

    // 演示不同级别的日志输出
    println!("=== 日志系统演示 ===");
    
    log::trace!("这是一条 TRACE 级别的日志,用于最详细的调试信息");
    log::debug!("这是一条 DEBUG 级别的日志,包含调试信息: {}", "调试数据");
    log::info!("这是一条 INFO 级别的日志,记录程序运行状态");
    log::warn!("这是一条 WARN 级别的日志,表示潜在问题: {}", "警告信息");
    log::error!("这是一条 ERROR 级别的日志,记录错误: {}", "错误详情");
    
    // 测试关键词高亮功能
    println!("\n--- 测试关键词高亮功能 ---");
    log::info!("这条日志包含关键词 ERROR,应该被高亮显示");
    log::info!("这条日志包含关键词 WARN,也应该被高亮显示");
    log::info!("这是一条重要的系统消息,包含中文关键词");
    log::info!("普通日志消息,不包含任何关键词");
    log::error!("严重 ERROR: 数据库连接失败,这是一个重要的错误信息");
    
    println!("\n--- 配置说明 ---");
    println!("当前配置:");
    println!("  - 显示进程ID: 是");
    println!("  - 显示线程信息: 是");
    println!("  - 显示模块路径: 是");
    println!("  - 日志级别: {}", log_level);
    println!("\n注意: 日志系统只能初始化一次,如需测试不同配置,请修改上述配置参数后重新运行程序。");
    
    // 演示结构化日志
    log::info!("用户登录: user_id={}, ip={}, timestamp={}", 12345, "192.168.1.100", "2024-08-14T18:23:46Z");
    
    // 演示多线程日志
    let handles: Vec<_> = (0..3).map(|i| {
        thread::spawn(move || {
            thread::sleep(Duration::from_millis(100 * i));
            log::info!("线程 {} 执行完成", i);
        })
    }).collect();
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    log::info!("日志演示完成,请查看控制台输出和日志文件: {}", log_dir);
    
    // 确保所有日志都被写入
    log::logger().flush();
    thread::sleep(Duration::from_millis(100));
}

Commit count: 0

cargo fmt