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 异步

Download history 175/week @ 2024-04-22 468/week @ 2024-04-29 272/week @ 2024-05-06 136/week @ 2024-05-13 804/week @ 2024-05-20 550/week @ 2024-05-27 446/week @ 2024-06-03 782/week @ 2024-06-10 1451/week @ 2024-06-17 1108/week @ 2024-06-24 1285/week @ 2024-07-01 235/week @ 2024-07-08 737/week @ 2024-07-15 481/week @ 2024-07-22 1198/week @ 2024-07-29 1146/week @ 2024-08-05

每月3,581次下载
用于 23 个crate(4个直接使用)

MIT/Apache

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