#log #logging #macro #macro-derive #function #derive #log-level

dev logcall

一个记录函数返回值的属性宏

10 个版本

0.1.9 2024年6月19日
0.1.8 2024年6月19日
0.1.5 2023年8月19日
0.1.4 2023年7月22日

#log-level 中排名 88

Download history 2555/week @ 2024-05-05 2709/week @ 2024-05-12 2319/week @ 2024-05-19 1809/week @ 2024-05-26 2082/week @ 2024-06-02 1650/week @ 2024-06-09 2062/week @ 2024-06-16 2392/week @ 2024-06-23 2414/week @ 2024-06-30 2455/week @ 2024-07-07 1844/week @ 2024-07-14 2046/week @ 2024-07-21 1744/week @ 2024-07-28 1981/week @ 2024-08-04 1433/week @ 2024-08-11 1395/week @ 2024-08-18

每月下载量 6,692
4 个 crate 中使用

MIT 许可协议

23KB
379 代码行

logcall

Crates.io Crates.io Documentation CI Status Crates.io

logcall 是一个 Rust 过程宏 crate,旨在自动记录函数调用、它们的输入和输出。此宏通过提供详细的函数执行日志,以最小的样板代码,简化了调试和监控过程。

这是一个与 log-derive crate 兼容的 async-trait 的重实现。

安装

logcall 添加到你的 Cargo.toml

[dependencies]
logcall = "0.1"

用法

导入 logcall crate 并使用宏注解你的函数

use logcall::logcall;

/// Logs the function call at the default `debug` level.
#[logcall]
fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// Logs the function call at the `info` level.
#[logcall("info")]
fn multiply(a: i32, b: i32) -> i32 {
    a * b
}

/// Logs `Ok` results at the `info` level and `Err` results at the `error` level.
#[logcall(ok = "info", err = "error")]
fn divide(a: i32, b: i32) -> Result<i32, String> {
    if b == 0 {
        Err("Division by zero".to_string())
    } else {
        Ok(a / b)
    }
}

/// Logs errors at the `error` level. No log output for `Ok` variant.
#[logcall(err = "error")]
fn divide2(a: usize, b: usize) -> Result<usize, String> {
    if b == 0 {
        Err("Division by zero".to_string())
    } else {
        Ok(a / b)
    }
}

/// Logs the function call with custom input logging format.
#[logcall(input = "a = {a:?}, ..")]
fn subtract(a: i32, b: i32) -> i32 {
    a - b
}

fn main() {
    env_logger::builder()
        .filter_level(log::LevelFilter::Trace)
        .init();

    add(2, 3);
    multiply(2, 3);
    divide(2, 0).ok();
    divide2(2, 0).ok();
    subtract(3, 2);
}

日志输出

main 函数运行时,它初始化记录器并按指定记录每个函数调用

[2024-06-19T15:01:23Z DEBUG main] main::add(a = 2, b = 3) => 5
[2024-06-19T15:01:23Z INFO  main] main::multiply(a = 2, b = 3) => 6
[2024-06-19T15:01:23Z ERROR main] main::divide(a = 2, b = 0) => Err("Division by zero")
[2024-06-19T15:01:23Z ERROR main] main::divide2(a = 2, b = 0) => Err("Division by zero")
[2024-06-19T15:01:23Z DEBUG main] main::subtract(a = 3, ..) => 1

自定义

  • 默认日志级别:如果没有指定日志级别,logcall 将在 debug 级别记录
    #[logcall]
    
  • 指定日志级别:使用宏参数指定日志级别
    #[logcall("info")]
    
  • Result 指定日志级别:使用 okerr 参数为 OkErr 变体指定日志级别
    #[logcall(err = "error")]
    #[logcall(ok = "info", err = "error")]
    
  • 自定义输入日志:使用 input 参数自定义输入日志格式
    #[logcall(input = "a = {a:?}, ..")]
    #[logcall("info", input = "a = {a:?}, ..")]
    #[logcall(ok = "info", err = "error", input = "a = {a:?}, ..")]
    

贡献

欢迎贡献!请提交拉取请求或打开问题来改进 crate。

许可协议

此项目采用 MIT 许可协议。

依赖项

~1.5MB
~37K SLoC