#logger #logging #log-file #macro #error-message #console-log

logger-rust

一个支持5种日志类型和3种日志级别的日志库

13个版本

0.2.12 2023年6月9日
0.2.10 2023年6月7日
0.1.45 2023年6月6日

调试 类别中排名第 210

Download history 1/week @ 2024-04-29 9/week @ 2024-05-20 2/week @ 2024-05-27 5/week @ 2024-06-03 8/week @ 2024-06-17 5/week @ 2024-07-01 1/week @ 2024-07-08 2/week @ 2024-07-15 118/week @ 2024-07-29

每月下载 121

自定义许可

38KB
378

日志宏

该库为Rust项目提供简单灵活的日志系统。您可以使用宏记录不同类型的消息(错误、警告、信息、调试),并选择将消息记录到控制台、文件或两者同时记录。

特性

  • 使用宏记录不同类型的消息(错误、警告、信息、调试)
  • 选择是否将消息记录到控制台、文件或两者同时记录
  • 在运行时设置日志级别
  • 根据当前日期自动创建和追加日志文件
  • 处理写入日志文件时的错误

用法

要将此库用于您的项目,请在您的 Cargo.toml 文件中将它添加为依赖项

[dependencies]
logger-rust = "0.2.12"

然后,导入库

use logger_rust::*;

现在,您可以使用 log_error!log_warn!log_info!log_debuglog_trace! 宏来记录不同类型的消息

fn main() {
    log_error!("An error occurred: {}", "Something went wrong");
    log_warn!("A warning occurred: {}", "Something might be wrong");
    log_info!("An info message: {}", "Something happened");
    log_debug!("A debug message: {}", "Something happened in detail");
}

log_trace! 示例


#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

fn main() {
    let my_struct = MyStruct;
    my_struct.do_something();
    log_trace!(my_struct.do_something());
    
    let x = 5;
    log_trace!(x);

    let person = Person { name: "Alice".to_string(), age: 20 };
    log_trace!(person, person.name);
}

输出

2023-06-09 15:06:46 [TRACE] src\main.rs:L23/C5 - used: my_struct.do_something() ->> (()): () | Type: <()> | ThreadId(1) ->> Timestamp: UN1686305206652692IX | Module: debug
2023-06-09 15:06:46 [TRACE] src\main.rs:L26/C5 - used: x ->> (5): 5 | Type: <i32> | ThreadId(1) ->> Timestamp: UN1686305206653039IX | Module: debug
2023-06-09 15:06:46 [TRACE] src\main.rs:L29/C5 - used: person ->> (Person { name: "Alice", age: 20 }): Person { name: "Alice", age: 20 } | Type: <debug::Person> | ThreadId(1) ->> Timestamp: UN1686305206653281IX ->> Context: <Alice> | Module: debug

默认情况下,日志消息将打印到控制台。您可以使用 set_log_level 函数指定日志消息的写入位置

use logger_rust::*;

fn main() {
    set_log_level(LogLevel::Both);

    // ...
}

set_log_level 函数接受一个 LogLevel 作为参数。您可以将以下变体之一传递给指定日志消息的写入位置

  • LogLevel::Console:仅将日志消息打印到控制台。
  • LogLevel::File:仅将日志消息写入文件。
  • LogLevel::Both:将日志消息打印到控制台并写入文件。

当将消息记录到文件时,crate 将自动创建一个基于当前日期的新文件(例如,2023-06-04.log)或追加到具有相同名称的现有文件。如果在写入文件时发生错误(例如,如果文件不可访问),则将在控制台打印错误消息。

此外,您还可以设置自定义日志路径。默认路径与您的 Cargo.toml 文件所在的路径相同。set_log_path 函数接受一个 string 作为参数。您可以通过传递以下变体之一来指定日志消息应写入的位置

use logger_rust::*;

fn main() {
    set_log_path(LogConfig::Path(LogPath::from("/path/to/log/dir")));
}

将在您指定的目录创建日志文件。

请注意,如果您使用 "." 作为目录(实际上并不必要),您将得到一个错误消息,因为目录已经忙。

日志轮换

从版本 1.0.39 开始,您可以创建一个 log rotator 实例,允许您根据大小和持续时间拆分日志。

  • log_path: 日志目录的路径;
  • max_size (u64): 日志文件的最大大小;
  • max_life (std::time::Duration): 日志文件的最大生命周期;

以下是一个示例

use logger_rust::*; // importing logger
use std::{
    path::PathBuf,
    time::Duration
};

fn main() {
    set_log_path(LogConfig::Rotator(LogRotatorConfig::new(
        PathBuf::from("C:/Users/JK/Desktop"), // path to the log directory
        5 * 1024 * 1024, // 5 MB
        Duration::from_secs(3600), // duration
    )));
}

请注意,您不应在单个实例中使用 LogRotator 和 LogPath。这将阻塞日志文件。

示例

以下是一个示例,说明如何在 Rust 项目中使用此 crate

use logger_rust::*;

fn main() {
    set_log_level(LogLevel::Both);
    log_error!("An error occurred: {}", "Something went wrong");
    log_warn!("A warning occurred: {}", "Something might be wrong");
    log_info!("An info message: {}", "Something happened");
    log_debug!("A debug message: {}", "Something happened in detail");
    // ...
}

如果您愿意,您还可以添加 set_log_path(LogConfig::Path(LogPath::From("string") 方法

use logger_rust::*;

fn main() {
    set_log_level(LogLevel::Both);
    set_log_path(LogConfig::Path(LogPath::from("C:/Users/JK/Desktop"))); // will output logs on desktop

    log_error!("An error occurred: {}", "Something went wrong");
    log_warn!("A warning occurred: {}", "Something might be wrong");
    log_info!("An info message: {}", "Something happened");
    log_debug!("A debug message: {}", "Something happened in detail");
}

您也可以使用这个

    error(&current_time(), "An error message");
    warn(&current_time(), "A warning message");
    info(&current_time(), "An info message");

输出

- 2023-06-05 12:23:25 [ERROR] An error occurred: Something went wrong
- 2023-06-05 12:23:25 [WARN] A warning occurred: Something might be wrong
A warning occurred: Something might be wrong
+ 2023-06-05 12:23:25 [INFO] An info message: Something happened
An info message: Something happened
+ 2023-06-05 12:23:25 [DEBUG] A debug message: Something happened in detail
A debug message: Something happened in detail

自定义日志

从 0.1.2 版本开始,您可以使用宏创建自定义日志函数。

  1. 创建一个名为所需函数的 class(例如,custom
pub fn custom(now: &str, message: &str) {
    log_message("TRACE", now, message);
}

请注意,log_message 函数需要 3 个参数:nowmessage,但您可以使用任何您想要的。2. 为您创建的方法创建宏

#[macro_export]
macro_rules! log_custom {
    ($($arg:tt)*) => {{
        let now = $crate::current_time(); // create a timestamp
        $crate::trace(&now, &format!($($arg)*)); // output the timestamp with message
    }}
}

请注意,arg 需要 2 个参数。3. 使用它

fn main() {
    set_log_level(LogLevel::Both);
    log_custom!("A custom log macros");
}

由于您有 fn custom,您也可以使用这个

    custom(&current_time(), "A custom log");

它做的是一样的事情,但您可以用值代替 &current_time()。但它需要 2 个参数

  1. 一个 &str now 在我们的上下文中
  2. 一个包含消息的字符串值。

依赖关系

~1.2–2MB
~36K SLoC