日志限频功能使用
本日志系统基于令牌桶算法实现细粒度限频控制,可对不同日志语句进行独立频率限制,避免日志洪泛问题。
使用方法
1.基础配置
在应用初始化时,通过 init_tracing_logger 方法配置日志系统的默认限频参数。主要包括:
- 日志级别:如
"info" - 配置对象:传入系统配置
- 是否发送到web:默认
false - 默认令牌桶容量:如
50.0 - 默认令牌恢复周期:如
1.0秒
2.限频参数配置
在日志输出时,可以通过特定参数控制每条日志的限频行为:
interval:令牌恢复周期(单位:秒)max_tokens:令牌桶容量
参数说明
| 参数 | 默认来源 | 说明 |
|---|---|---|
| interval | init_tracing_logger配置传入 | 令牌恢复周期(单位:秒),设为0时关闭限频 |
| max_tokens | init_tracing_logger配置传入 | 令牌桶最大容量,同时决定初始令牌数 |
运行示例解析
for i in 0..30 {
// 每条日志独立限频(覆盖默认配置)
info!(interval = 1., max_tokens = 1., "test {i}"); // 令牌桶A
info!(interval = 1., max_tokens = 1., "test2 {i}"); // 令牌桶B
std::thread::sleep(std::time::Duration::from_millis(200));
}
执行效果:
- 并行限频:两条日志各自使用独立令牌桶
- 输出频率:
- 每200ms触发一次循环(每秒5次)
- 每个日志语句:
- 初始1个令牌
- 每1秒恢复1个令牌
- 实际每秒最多输出1条日志
- 最终结果:每条日志30次调用中,约1/5被实际输出
注意事项
- 桶独立性:不同位置的日志会创建独立令牌桶
- 默认配置:未显式设置参数时使用
init_tracing_logger传入的默认值 - 关闭限频: 设置
interval = 0可完全禁用当前日志的限频 - 精度控制: 浮点参数支持小数配置(如
interval = 0.5表示每0.5秒恢复1令牌)
限频模型示意图
令牌桶状态示例(max_tokens=3, interval=1)
| 时间(秒) | 令牌数 | 日志事件 |
|---|---|---|
| 0.0 | 3 | 消耗1令牌(剩余2) |
| 0.5 | 2 | 无新令牌 |
| 1.0 | 3 | 恢复1令牌(上限3) |
| 1.2 | 3 | 消耗1令牌(剩余2) |
更新说明
interval参数语义调整为令牌恢复周期(单位:秒)- 默认值配置入口迁移至
init_tracing_logger初始化接口,支持全局统一管理 - 新增配置对象
LogConfig用于承载默认限频参数