日志防刷屏的策略是什么

问题描述

log:notice触发的防刷屏功能后,5分钟内的日志合并策略是什么样的:
1 如果5分钟内的多条日志内容有差异还会合并吗?
2 如果内容有差异还是合并了,每5分钟输出的这段时间内的哪一条日志?

答案内容由AI生成,仅供参考:

总结

问题 回答
1. 内容不同的日志会被合并吗? :cross_mark: 不会。只有完全相同的内容才会触发合并。
2. 合并后输出哪一条日志? :white_check_mark: 输出第一条日志内容,并标注重复次数和时间范围。
3. 如何避免防刷屏影响调试? 使用 dloglimit false 或设置 MCC_DEBUG=1 关闭限流。

:pushpin: 建议:生产环境应启用防刷屏机制保护系统稳定性;调试阶段建议关闭限流以获取完整日志信息。

点击此处查看详细分析解答

日志防刷屏策略解析

在 openUBMC 系统中,为防止日志频繁输出导致系统性能下降或硬盘寿命损耗,系统内置了 日志防刷屏机制(Log Rate Limiting),该机制主要通过 dloglimit 工具和日志收集策略(如防折叠规则)来实现。

1. 防刷屏机制概述

  • log:noticelog:error 是系统中常用的日志打印方式。
  • 当某模块在短时间内重复打印相同或相似内容的日志时,系统会触发 防刷屏功能,避免日志“刷屏”造成资源浪费。
  • 可通过 dloglimit 命令控制特定组件的日志流速,例如:
    dloglimit true 60
    
    表示对当前组件启用 不限速模式 60 分钟(单位为分钟)。

:warning: 注意:该命令仅对支持 dloglimit 控制的组件有效。若日志来自动态库(如 C 语言编写的 storage 组件动态库),则 dloglimit 可能无法生效。


2. 5 分钟内日志的合并策略

根据上下文信息和 openUBMC 系统的行为逻辑,日志合并行为基于“内容是否重复”来判断,具体如下:

:white_check_mark: 问题 1:如果 5 分钟内的多条日志内容有差异,还会合并吗?

不会合并。

  • 系统的防刷屏机制(日志合并/折叠)仅针对完全相同或高度重复的内容
  • 如果日志内容存在差异(如参数不同、时间戳变化、状态不同),则视为 不同日志条目,不会被合并。
  • 合并触发条件:
    • 相同服务/组件。
    • 相同日志级别(如 NOTICE)。
    • 完全相同的日志消息文本。
    • 在设定的时间窗口内(通常为数秒至数分钟)高频出现。

:white_check_mark: 例如:

2026-03-11 21:15:46.022803 power_strategy NOTICE: Predict power table: []
2026-03-11 21:15:51.022803 power_strategy NOTICE: Predict power table: [1,2]

上述两条日志因内容不同,不会被合并


:white_check_mark: 问题 2:如果内容有差异但仍被合并了,系统会输出哪一条日志?

该情况不会发生。只有完全相同的日志才会被合并。

  • 若日志内容不同,系统不会合并。
  • 若日志完全相同,则采用 “折叠去重”策略,输出格式如下:
    [重复次数] 次 [时间范围] 内重复日志...
    
    例如:
    [system]mctp_engine: request timeout [repeated 15 times in 314s from 2026-03-11 21:11:23.205008 to 2026-03-11 21:16:37.619531]
    
    • 输出的是第一条日志内容
    • 附加信息包括:重复次数、总耗时、起止时间戳
    • 合并后的日志仅保留代表性条目 + 元数据,避免日志爆炸。

3. 如何关闭防刷屏机制?

当需要调试或排查问题时,可临时关闭日志限流:

方法一:使用 dloglimit

dloglimit false

禁用当前组件的日志限流(需在对应组件上下文中执行)。

方法二:设置全局调试环境变量(适用于动态库)

对于 dloglimit 无法控制的场景(如 storage 加载的 C 动态库):

export MCC_DEBUG=1

或在 /dev/shm/dbus/.dbus 文件中添加:

MCC_DEBUG=1

然后重启相关服务或系统,即可 关闭整个系统的日志限流功能


总结

问题 回答
1. 内容不同的日志会被合并吗? :cross_mark: 不会。只有完全相同的内容才会触发合并。
2. 合并后输出哪一条日志? :white_check_mark: 输出第一条日志内容,并标注重复次数和时间范围。
3. 如何避免防刷屏影响调试? 使用 dloglimit false 或设置 MCC_DEBUG=1 关闭限流。

:pushpin: 建议:生产环境应启用防刷屏机制保护系统稳定性;调试阶段建议关闭限流以获取完整日志信息。

如何理解高度重复?

进程启动后的30s内,不启动日志限流。开启限流之后,每个行号前15条直接打印,第16条开始日志重复判断,抑制逻辑如下:

  1. 行号一致,内容一致,为重复日志则抑制
  2. 行号一致,内容不一致,为含动态参数,如果动态参数日志条数超过15条则抑制

简单讲 重复日志15条 动态重复日志30条

抑制日志打印条件如下:

  1. 日志限流条数达到1000条时,打印日志限流信息
  2. 进程持续300S无日志刷新,有日志管理线程将被抑制但未满1000条的日志打印出来,带[flush]字段
  3. 日志限流时间已经超过300s,且未触发条件2,此时打印日志会附带限流信息
    当抑制日志打印出来之后,则代表对日志的抑制结束。