Rust log 打印日志所在文件以及行数

1,098 阅读1分钟

演示

为了快速定位问题,通常把错误发生的文件以及行号打印出来。比如:

示例代码:

1. use log_example_rs::example;
2. use log_example_rs::log;
3. 
4. fn main() {
5.     log!("start");
6. 
7.     example::example1();
8.     example::example2();
9.     example::example3();
10. 
11.     log!("done")
12. }

输出:

[2022-05-15 13:12:32] src/main.rs:5: "start"
[2022-05-15 13:12:32] src/example/mod.rs:4: "message from example1"
[2022-05-15 13:12:32] src/example/mod.rs:8: "message from example2"
[2022-05-15 13:12:32] src/example/mod.rs:12: "message from example3"
[2022-05-15 13:12:32] src/main.rs:11: "done"

从日志格式中,能轻易的定位到问题所在的代码文件以及行数,提供了一种快速解决问题的途径。

如何实现

实现代码 log.rs

#[macro_export]
macro_rules! log {
    ($($args: expr),*) => {
        $(
            print!("[{}] {}:{}: {:?}\n",chrono::prelude::Local::now().format("%Y-%m-%d %H:%M:%S").to_string(), file!(), line!(),$args);
        )*
    }
}

利用四个函数上述日志格式的输出:

print!() : 输出字符串
file!()  : 输出源文件地址
line!()  : 输出代码调用行数
chrono   : 提供日期及格式

完整代码实例

github