请求解决RabbitMQ中lager_error_logger_h丢弃日志消息问题
lager_error_logger_h限流警告的问题 问题场景
我在运维RabbitMQ 3.7.2(搭配Erlang 20.1)时,日志里一直重复刷出如下警告信息,想请大家帮忙解决:
11:42:16.000 [warning] <0.32.0> lager_error_logger_h dropped 105 messages in the last second that exceeded the limit of 100 messages/sec
先同步下当前的环境和配置细节:
环境信息
- RabbitMQ版本:3.7.2
- Erlang版本:20.1
- 连接数:527
- 信道数:500
- 交换器数:49
- 队列数:4437
- 消费者数:131
- 消息发布速率:~200条/秒
- 消息确认速率:~200条/秒
当前配置项
disk_free_limit.absolute = 5GBlog.default.level = warninglog.file.level = warning
解决方案
这个警告是RabbitMQ底层依赖的日志框架lager触发的限流机制——默认情况下它对error_logger的消息处理有100条/秒的上限,当系统日志生成速度超过这个阈值,就会触发该警告。给你几个实用的解决方向:
直接调高lager的消息限流阈值
你可以修改RabbitMQ的配置文件(比如advanced.config),添加lager的配置项来提高这个限制,比如调到500条/秒:[{lager, [ {error_logger_hwm, 500} ]}].修改完成后重启RabbitMQ即可生效,这个方法能快速解决警告刷屏的问题,适合确认日志量确实合理的场景。
排查日志过载的根源
虽然你已经把日志级别设为warning,但系统可能仍在大量生成warning级别的日志。建议临时把日志级别调低到info(短时间内可以开debug,注意不要长期开启,会影响性能),查看具体是哪些内容在刷日志——比如是否有队列异常、连接频繁断开重连、业务逻辑触发的重复警告等。找到根源后针对性修复,从源头减少日志量,比单纯调高阈值更稳妥。检查版本兼容性(兜底方案)
你当前的RabbitMQ和Erlang版本是官方支持的组合,但部分Erlang小版本可能在日志处理上存在细节问题。如果前两个方法无效,可以尝试升级Erlang到20.x分支的最新版本(比如20.3),或者升级RabbitMQ到3.7.x的后续小版本,看看是否能解决日志框架的潜在问题。
内容的提问来源于stack exchange,提问作者Alexander Sokolov

