RabbitMQ存储日志无法清空 删除后自动恢复如何解决
问题根因
- 直接手动删除、定时脚本删除日志文件时,RabbitMQ服务进程始终持有目标日志文件的打开句柄,文件系统层面的删除操作不会通知RabbitMQ释放句柄,进程会持续向原文件映射的磁盘块写入日志,既不会释放已占用的20GB磁盘空间,还会在服务重启/句柄重连时自动重建同路径的日志文件,表现为“删除后自动恢复”。
- 现有定时清理脚本逻辑错误,直接删除正在被进程写入的活跃日志文件,没有通过RabbitMQ提供的专用接口触发日志切换,清理机制完全失效。
- 当前
rabbitmq.config未配置任何日志滚动、日志生命周期规则,默认配置下RabbitMQ不会自动切割、清理过期日志,单日志文件会无限增长。
修复操作步骤
1. 安全清理现有大体积日志,无自动恢复风险
不要直接在资源管理器或命令行删除正在写入的日志文件,使用RabbitMQ自带的日志轮转命令操作,全程不需要停止服务,不影响业务运行:
- 以管理员身份打开命令提示符,切换到RabbitMQ安装目录下的sbin文件夹,默认路径为
D:\RabbitMQ Server\rabbitmq_server-<对应版本号>\sbin - 执行日志轮转命令:
rabbitmqctl rotate_logs - 命令执行完成后,原有20GB的大日志会被自动重命名为带时间戳的归档文件,RabbitMQ会创建新的空日志文件继续写入。此时直接删除所有带时间戳的旧归档日志即可,磁盘空间会立刻释放,不会出现文件自动恢复的问题。
注意:清理时不要删除当前无时间戳后缀的新生成空日志文件,避免触发服务异常。
2. 配置永久自动日志清理规则,替代原有失效定时任务
编辑RabbitMQ配置文件(路径为D:\RabbitMQ Server\config\rabbitmq.config),在原有配置中补充日志滚动规则,修改后的完整配置如下:
[ {rabbit, [ {ssl_listeners, [1111]}, {ssl_options, [{cacertfile,"D:\\RabbitMQ Server\\Certs\\certname.cer"}, {certfile,"D:\\RabbitMQ Server\\Certs\\cer_cername_host.cer"}, {keyfile,"D:\\RabbitMQ Server\\Certs\\cer_cername_host.pfx"}, {verify,verify_peer}, {fail_if_no_peer_cert,false}]}, {log, [ {file, [{rotation, {size, 1073741824}}, {rotation_count, 10}, {formatter_config, [time, " [", level, "] ", msg, "\n"]} ]}, {console, [{level, info}]} ]} ]} ].
配置规则说明:
- 单日志文件最大体积为1GB,达到阈值后RabbitMQ会自动切割日志,不会出现单文件增长到几十GB的情况
- 最多保留10个历史归档日志,总日志占用空间最大为10GB,超出数量的最早日志会被RabbitMQ自动删除,不需要额外配置定时任务。
3. 生效配置
保存配置文件后,在管理员权限的命令行执行服务重启命令即可:net stop RabbitMQ && net start RabbitMQ
重启完成后可验证:日志文件达到1GB时会自动切割,超量旧日志自动清理,删除归档日志不会再出现自动恢复、磁盘空间不释放的问题。
内容的提问来源于stack exchange,提问作者Minions
相关产品推荐
相关产品推荐

