#logging #multi-threading #log-messages #filename #iso-8601 #low-dependency

mt_logger

一个低依赖、多线程的日志库,通过宏实现可追溯性和易用性

2个稳定版本

3.0.2 2021年12月18日
3.0.0 2021年6月28日
2.2.1 2021年6月28日
1.0.2 2021年6月15日

调试 中排名第 276

Download history 15/week @ 2024-03-13 142/week @ 2024-03-20 7/week @ 2024-03-27 16/week @ 2024-04-03 6/week @ 2024-04-17 18/week @ 2024-04-24 5/week @ 2024-05-08 18/week @ 2024-05-15 20/week @ 2024-05-22 4/week @ 2024-06-05 15/week @ 2024-06-12 53/week @ 2024-06-19 72/week @ 2024-06-26

每月下载 144
abd-clam 中使用

GPL-3.0-only

91KB
801 行(不含注释)

mt_logger 是一个专注于可追溯性和通过宏实现易用性的多线程Rust日志库。

日志存储在名为 logs 的目录中,位于程序启动时的当前工作目录内。如果目录不存在,则会创建。日志文件名符合 ISO 8601 标准,但将冒号 : 替换为 _ 以满足Windows文件命名要求。默认情况下,将包名(从环境变量 CARGO_PKG_NAME 中获取)添加到日志文件名前。
示例:cool_game_engine/logs/cool_game_engine_2021-06-27T22_08_38.474-0600.log

在初始化时,创建一个线程来接收主线程的日志消息和命令。在发送之前设置时间戳,以保持完整的可追溯性。

用法

推荐使用宏来使用 mt_logger。通过 mt_new!() 创建全局日志发送/接收对,因此所有进一步的日志消息和命令都可以通过调用适当的宏来发出,例如,使用 mt_log!() 发送日志消息。不需要传递日志实例的引用,也不需要克隆 mpsc::Sender

此外,所有宏在全局实例未初始化时本质上不执行任何操作。这允许以最小的代码影响启用/禁用日志记录。例如,一个程序可能只在传递-log开关时调用mt_new!(),从而使程序在省略开关时能够静默运行。

注意

尽管保证了准确的时间戳和消息的正确顺序,但由于多线程的性质,记录日志消息到输出流的时间是不确定的。宏mt_flush!()解决了这个问题。它将阻塞,直到所有排队消息都刷新到指定的输出流中。建议在程序关闭时调用此宏,否则任何排队消息都将丢失。

示例

use mt_logger::*;

fn main() {
    // Initialize the mt_logger global instance
    mt_new!(None, Level::Info, OutputStream::Both);

    // Send a log message that WILL be output to BOTH file and stdout
    mt_log!(Level::Info, "Message {}: an INFO message", 1);
    // Send a log message that WILL NOT be output
    mt_log!(Level::Debug, "Message {}: a DEBUG message", 2);

    // Change the output stream to stdout only
    mt_stream!(OutputStream::StdOut);

    // Change the logging level
    mt_level!(Level::Trace);

    // Send a log message that WILL be output to stdout ONLY
    mt_log!(Level::Info, "Message {}: an INFO message", 3);
    // Send a log message that WILL be output to stdout ONLY
    mt_log!(Level::Trace, "Message {}: a TRACE message", 4);

    // Flush to ensure all messages reach the specified output
    mt_flush!().unwrap();

    // Get a count of the number of log messages
    let msg_count = mt_count!();
    println!("Messages logged: {}", msg_count);
}

输出样本

控制台

文件

2021-06-27T21:09:21.221721100: [  TRACE  ] mt_logger::tests::format_verification() line 597:
   This is a TRACE message.
2021-06-27T21:09:21.334663300: [  DEBUG  ] mt_logger::tests::format_verification() line 598:
   This is a DEBUG message.
2021-06-27T21:09:21.334673300: [  INFO   ] mt_logger::tests::format_verification() line 599:
   This is an INFO message.
2021-06-27T21:09:21.334677300: [ WARNING ] mt_logger::tests::format_verification() line 600:
   This is a WARNING message.
2021-06-27T21:09:21.334680800: [  ERROR  ] mt_logger::tests::format_verification() line 601:
   This is an ERROR message.
2021-06-27T21:09:21.334684300: [  FATAL  ] mt_logger::tests::format_verification() line 602:
   This is a FATAL message.

依赖

~1MB
~19K SLoC