跳到主要内容

日志限频功能使用

本日志系统基于令牌桶算法实现细粒度限频控制,可对不同日志语句进行独立频率限制,避免日志洪泛问题。

使用方法

1.基础配置

在应用初始化时,通过 init_tracing_logger 方法配置日志系统的默认限频参数。主要包括:

  • 日志级别:如 "info"
  • 配置对象:传入系统配置
  • 是否发送到web:默认false
  • 默认令牌桶容量:如 50.0
  • 默认令牌恢复周期:如 1.0

2.限频参数配置

在日志输出时,可以通过特定参数控制每条日志的限频行为:

  • interval:令牌恢复周期(单位:秒)
  • max_tokens:令牌桶容量

参数说明

参数默认来源说明
intervalinit_tracing_logger配置传入令牌恢复周期(单位:秒),设为0时关闭限频
max_tokensinit_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));
}

执行效果

  1. 并行限频:两条日志各自使用独立令牌桶
  2. 输出频率
  • 每200ms触发一次循环(每秒5次)
  • 每个日志语句:
    • 初始1个令牌
    • 每1秒恢复1个令牌
    • 实际每秒最多输出1条日志
  1. 最终结果:每条日志30次调用中,约1/5被实际输出

注意事项

  1. 桶独立性:不同位置的日志会创建独立令牌桶
  2. 默认配置:未显式设置参数时使用init_tracing_logger传入的默认值
  3. 关闭限频: 设置interval = 0可完全禁用当前日志的限频
  4. 精度控制: 浮点参数支持小数配置(如interval = 0.5表示每0.5秒恢复1令牌)

限频模型示意图

令牌桶状态示例(max_tokens=3, interval=1)

时间(秒)令牌数日志事件
0.03消耗1令牌(剩余2)
0.52无新令牌
1.03恢复1令牌(上限3)
1.23消耗1令牌(剩余2)

更新说明

  1. interval参数语义调整为令牌恢复周期(单位:秒)
  2. 默认值配置入口迁移至init_tracing_logger初始化接口,支持全局统一管理
  3. 新增配置对象LogConfig用于承载默认限频参数