Docker版GitLab升级出现buffer overflow日志报错如何解决
问题根因
该报错与GitLab版本升级的数据库迁移、业务服务配置无关,属于日志轮转组件的读取异常。
报错特征指向tail命令读取损坏日志文件时触发glibc缓冲区溢出保护,被SIGABRT(信号6)强制终止,从gitlab-ctl status输出可以看到所有核心服务均处于正常运行状态,业务功能不会受该问题影响。
排查步骤
- 定位触发源:报错信息中罗列的路径均为
/var/log/gitlab/下后缀为.backup的历史轮转日志,触发报错的是logrotate组件的日志巡检脚本,该脚本会通过xargs调用tail遍历所有历史日志文件。 - 验证故障点:进入GitLab容器执行以下命令,可稳定复现相同报错:
find /var/log/gitlab -name "*.backup" | xargs tail -n 1
- 确认损坏文件:执行以下命令查看备份日志属性,可发现对应
.backup文件为跨版本升级时遗留的空文件、截断损坏文件,这类文件会触发tail的缓冲区溢出检测:
ls -lh /var/log/gitlab/gitlab-rails/*.backup
修复方案
- 清理损坏的历史备份日志:注意:这些文件是已经完成轮转的归档日志,删除不会影响GitLab运行、不会丢失业务数据,执行命令:
find /var/log/gitlab -name "*.backup" -type f -delete
- 重启logrotate服务重置状态:
gitlab-ctl restart logrotate
- 验证修复效果:手动触发一次全量日志轮转,无buffer overflow报错即为修复完成:
/opt/gitlab/embedded/sbin/logrotate -fv /var/opt/gitlab/logrotate/logrotate.conf
- 可选配置加固:编辑
/etc/gitlab/gitlab.rb添加以下配置,避免后续日志轮转时出现文件截断问题,配置完成后执行gitlab-ctl reconfigure生效:
logging['logrotate_size'] = "200M" logging['logrotate_options'] = ["compress", "copytruncate", "delaycompress", "notifempty"]
内容的提问来源于stack exchange,提问作者Benderino
相关产品推荐
相关产品推荐

