1 个不稳定版本
0.1.0 | 2020年6月3日 |
---|
#851 in 进程宏
15KB
221 行
logfn
此crate提供logfn
属性宏,用于将日志代码插入到您的函数中。
它深受elichai的log-derive
crate的启发。
目前我们支持两种类型的日志。
- 前置日志
- 后置日志
我们还计划添加Time logging
和Count 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