8个版本 (重大更新)
0.21.0 | 2024年8月1日 |
---|---|
0.20.0 | 2024年6月27日 |
0.19.0 | 2024年6月5日 |
0.18.0 | 2024年4月30日 |
0.1.0 | 2023年12月4日 |
#250 in 异步
每月3,581次下载
用于 23 个crate(4个直接使用)
250KB
3.5K SLoC
对频繁事件的速率限制日志
我们经常想要在事件发生时告知用户,但这些事件可能非常频繁。在这种情况下,我们不希望每小时记录一千次“出现了问题!”,相反,我们希望日志看起来更像是“连接到哨兵X:错误(在过去一小时中发生1310/2000次)”。
该crate是Arti的一部分,不适用于外部使用:它假设您的日志系统是tracing
,并且您正在使用tor_rtcompat
进行异步运行时。
设置
在您可以使用此crate之前,您需要调用install_runtime
,否则消息将不会被收集。
示例
use tor_log_ratelim::log_ratelim;
# use std::num::ParseIntError;
pub fn parse_u8(source: &str, s: &str) -> u8 {
let r: Result<u8, ParseIntError> = s.parse();
log_ratelim!(
// The activity we were performing
"parsing an integer from {}", source;
// A Result to decide whether it succeeded
r;
// An error message to report on failure, with rate limiting,
// after some time has elapsed.
// The error itself is always reported.
Err(_) => WARN, "Had to use default";
// A success message to report (without rate limiting)
// on every success.
Ok(v) => TRACE, "Got {}", v;
);
r.unwrap_or(0)
}
上面的示例可能会产生类似以下这些的WARN
输出
WARN: Parsing an integer from cache: error (Problem occurred 7/10 times in the last minute): Had to use default: invalid digit found in string"
WARN: Parsing an integer from cache: error (Problem occurred 81/92 times in the last 5 minutes): Had to use default: number too large to fit in target type"
WARN: Parsing an integer from cache: now working (Problem occurred 0/106 times in the last 5 minutes)
以及类似的TRACE
输出
TRACE: Parsing an integer from cache: Got 7
TRACE: Parsing an integer from cache: Got 14
TRACE: Parsing an integer from the network: Got 2
有关log_ratelim!
以及更简单的调用方式的信息,请参阅其文档。
依赖项
~4.5–7MB
~133K SLoC