Rust轻量级日志库simple-logging的使用,simple-logging提供简洁高效的日志记录功能

Rust轻量级日志库simple-logging的使用,simple-logging提供简洁高效的日志记录功能

simple-logging是一个为Rust的log facade提供的简单日志记录器。它会将每条日志信息单独写为一行,每行包含日志记录时间、日志级别和线程ID。

示例

基本使用

大多数用户只需要调用log_to_file()函数并指定日志文件路径和最低日志级别:

use log::LevelFilter;

simple_logging::log_to_file("test.log", LevelFilter::Info);

或者使用log_to_stderr()将日志输出到标准错误流:

use log::LevelFilter;

simple_logging::log_to_stderr(LevelFilter::Info);

高级控制

如果需要更多控制,可以使用log_to()函数,它可以接受任何实现了Write + Send + 'static特性的输出目标:

use log::LevelFilter;
use std::io;

simple_logging::log_to(io::sink(), LevelFilter::Info);

完整示例代码

下面是一个完整的示例,展示如何使用simple-logging记录日志:

#[macro_use]
extern crate log;

use log::LevelFilter;
use simple_logging;

fn main() {
    // 初始化日志记录器,将日志写入test.log文件,记录Info及以上级别的日志
    simple_logging::log_to_file("test.log", LevelFilter::Info)
        .expect("无法初始化日志记录器");

    // 记录不同级别的日志
    trace!("这是一条trace级别的日志");  // 不会记录,因为级别低于Info
    debug!("这是一条debug级别的日志");  // 不会记录
    info!("这是一条info级别的日志");    // 会记录
    warn!("这是一条warn级别的日志");    // 会记录
    error!("这是一条error级别的日志");   // 会记录

    // 示例日志输出格式:
    // [2023-01-01T12:34:56Z INFO  main] 这是一条info级别的日志
    // [2023-01-01T12:34:56Z WARN  main] 这是一条warn级别的日志
    // [2023-01-01T12:34:56Z ERROR main] 这是一条error级别的日志
}

要使用simple-logging,需要在Cargo.toml中添加依赖:

[dependencies]
log = "0.4"
simple-logging = "2.0.2"

simple-logging是一个轻量级、简单易用的日志库,特别适合需要基本日志功能而又不想引入复杂依赖的项目。

完整示例demo

下面是一个更完整的示例,展示如何在多线程环境中使用simple-logging:

#[macro_use]
extern crate log;

use log::{LevelFilter, info, warn, error};
use simple_logging;
use std::thread;

fn main() {
    // 初始化日志记录器,将日志写入app.log文件
    simple_logging::log_to_file("app.log", LevelFilter::Debug)
        .expect("无法初始化日志记录器");

    info!("应用程序启动");  // 会记录
    
    // 在主线程中记录日志
    warn!("主线程警告信息");

    // 创建子线程记录日志
    let handle = thread::spawn(|| {
        debug!("子线程调试信息");  // 会记录,因为级别是Debug
        error!("子线程错误信息");
    });

    handle.join().unwrap();
    
    info!("应用程序结束");
}

日志输出示例:

[2023-01-01T10:00:00Z INFO  main] 应用程序启动
[2023-01-01T10:00:00Z WARN  main] 主线程警告信息
[2023-01-01T10:00:00Z DEBUG ThreadId(2)] 子线程调试信息
[2023-01-01T10:00:00Z ERROR ThreadId(2)] 子线程错误信息
[2023-01-01T10:00:00Z INFO  main] 应用程序结束

这个示例展示了:

  1. 如何设置Debug级别日志记录
  2. 在主线程和子线程中记录日志
  3. 不同日志级别的使用
  4. 自动包含的线程ID信息

1 回复

Rust轻量级日志库simple-logging使用指南

简介

simple-logging是一个轻量级的Rust日志库,提供了简洁高效的日志记录功能。它设计简单易用,适合需要基本日志功能而不想引入复杂依赖的项目。

主要特性

  • 轻量级实现
  • 支持标准日志级别(error, warn, info, debug, trace)
  • 可配置的输出格式
  • 线程安全的日志记录
  • 与标准log crate兼容

使用方法

1. 添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
log = "0.4"
simple-logging = "2.0"

2. 基本使用

use log::{info, error, warn};

fn main() {
    // 初始化日志,设置日志级别为Info
    simple_logging::log_to_file("my_app.log", log::LevelFilter::Info)
        .expect("Failed to initialize logging");
    
    info!("Application started");
    warn!("This is a warning message");
    error!("This is an error message");
    
    // 低于Info级别的日志不会被记录
    debug!("This debug message won't be logged");
}

3. 高级配置

use chrono::Local;
use log::LevelFilter;

fn main() {
    // 自定义日志格式
    simple_logging::log_to_file_with_format(
        "custom.log",
        LevelFilter::Debug,
        |buf, record| {
            let time = Local::now().format("%Y-%m-%d %H:%M:%S");
            writeln!(
                buf,
                "[{}] [{}] {}:{} - {}",
                time,
                record.level(),
                record.file().unwrap_or("unknown"),
                record.line().unwrap_or(0),
                record.args()
            )
        },
    )
    .expect("Failed to initialize logging");
    
    debug!("Debug message with custom format");
    info!("Info message with custom format");
}

4. 输出到标准输出

fn main() {
    // 输出到标准输出而不是文件
    simple_logging::log_to_stderr(log::LevelFilter::Trace);
    
    trace!("This will be printed to stderr");
    info!("So will this");
}

日志级别

simple-logging支持标准日志级别:

  • error! - 错误信息
  • warn! - 警告信息
  • info! - 常规信息
  • debug! - 调试信息
  • trace! - 跟踪信息

性能考虑

simple-logging在设计上考虑了性能:

  1. 低于当前日志级别的日志会尽早被过滤掉
  2. 使用缓冲写入减少IO操作
  3. 简单的格式化开销低

示例项目结构

my_app/
├── Cargo.toml
└── src/
    └── main.rs

main.rs中初始化日志后,可以在项目的任何地方使用log宏记录日志,只要确保log crate在作用域内。

注意事项

  1. 只能初始化一次日志系统,多次调用会返回错误
  2. 对于更复杂的需求,可以考虑env_loggerfern等更全功能的日志库
  3. 生产环境中可能需要考虑日志轮转,simple-logging本身不提供这个功能

simple-logging非常适合小型项目或需要快速集成日志功能的场景,它的简洁性使得学习和使用成本极低。

完整示例demo

下面是一个完整的simple-logging使用示例,展示了文件日志记录、自定义格式和标准输出日志:

// 导入必要的库
use log::{error, warn, info, debug, trace};
use chrono::Local;
use log::LevelFilter;

fn main() {
    // 示例1: 基本文件日志记录
    simple_logging::log_to_file("basic.log", LevelFilter::Debug)
        .expect("Failed to initialize basic logging");

    info!("This is a basic info message");
    debug!("This debug message will appear in basic.log");

    // 示例2: 自定义日志格式
    simple_logging::log_to_file_with_format(
        "custom_format.log",
        LevelFilter::Trace,
        |buf, record| {
            let time = Local::now().format("%Y-%m-%d %H:%M:%S");
            writeln!(
                buf,
                "[{}] [{}] {}:{} - {}",
                time,
                record.level(),
                record.file().unwrap_or("unknown"),
                record.line().unwrap_or(0),
                record.args()
            )
        },
    )
    .expect("Failed to initialize custom format logging");

    trace!("This trace message has custom format");
    
    // 示例3: 标准错误输出
    simple_logging::log_to_stderr(LevelFilter::Info);
    
    warn!("This warning goes to stderr");
    
    // 演示不同日志级别
    log_examples();
}

fn log_examples() {
    error!("This is an error message");
    warn!("This is a warning message");
    info!("This is an info message");
    debug!("This is a debug message");
    trace!("This is a trace message");
}

对应的Cargo.toml文件内容:

[package]
name = "simple_logging_demo"
version = "0.1.0"
edition = "2021"

[dependencies]
log = "0.4"
simple-logging = "2.0"
chrono = "0.4"

这个完整示例展示了:

  1. 基本的文件日志记录功能
  2. 自定义日志格式的功能
  3. 标准错误输出的配置
  4. 不同日志级别的使用方法
  5. 项目结构和依赖配置

运行后会生成两个日志文件:

  • basic.log - 包含基本日志信息
  • custom_format.log - 包含自定义格式的详细日志信息

同时部分日志会输出到标准错误流(stderr)。

回到顶部