#logging #fn #log #macro

macro logfn

提供logfn属性宏,用于将日志代码插入到您的函数中

1 个不稳定版本

0.1.0 2020年6月3日

#851 in 进程宏

MIT/Apache

15KB
221

logfn

此crate提供logfn属性宏,用于将日志代码插入到您的函数中。

它深受elichai的log-derive crate的启发。

目前我们支持两种类型的日志。

  • 前置日志
  • 后置日志

我们还计划添加Time loggingCount logging类型。

每个logfn属性注入一行日志代码。您可以根据需要添加多个logfn

# use logfn::logfn;
# use std::num::ParseIntError;
#[logfn(Pre, Debug, "{fn} will be executed")]
#[logfn(Post, Debug, "{fn} is executed", if = "Result::is_ok")]
#[logfn(Post, Error, "Error {fn}: {ret:?}", if = "Result::is_err")]
fn atoi(a: &str) -> Result<usize, ParseIntError> {
    usize::from_str_radix(a, 10)
}

详细信息请参见下面的文档。

前置日志

以下属性会在函数调用之前注入日志代码。

use logfn::logfn;

#[logfn(Pre, Info, "executing {fn}...")]
fn add(a: usize, b: usize) -> usize {
    a + b
}

生成的代码将类似于

fn add(a: usize, b: usize) -> usize {
    log::info!("executing add...");

    {
        a + b
    }
}

后置日志

您还可以在函数调用之后注入日志代码。

use logfn::logfn;

#[logfn(Post, Info, "executed {fn}!")]
fn add(a: usize, b: usize) -> usize {
    a + b
}

生成的代码将类似于

fn add(a: usize, b: usize) -> usize {
    let res = (move || {
        a + b
    })();

    log::info!("executed add!");

    res
}

条件日志

您可以配置触发日志代码的条件。为此,请在需要触发日志代码时添加带有返回值引用路径的if参数,并在返回值为true时触发日志代码。

注意

目前仅在后置日志中支持条件日志。

use logfn::logfn;

#[logfn(Post, Warn, "checked add is failed!!", if = "Option::is_none")]
fn checked_add(a: usize, b: usize) -> Option<usize> {
    a.checked_add(b)
}

消息格式化

我们支持以下格式模式。

  • "{fn}"插值函数名称
  • "{ret:?}"或"{ret}"插值返回值
# use std::num::ParseIntError;
use logfn::logfn;

#[logfn(Post, Error, "Error while {fn}: {ret:?}", if = "Result::is_err")]
fn atoi(s: &str) -> Result<usize, ParseIntError> {
    usize::from_str_radix(s, 10)
}

异步函数

也支持异步函数。

use logfn::logfn;

#[logfn(Post, Debug, "{fn} is executed")]
async fn add_fut(a: usize, b: usize) -> usize {
    a + b
}

依赖

~1.5MB
~35K SLoC