Linux /var/log 的 journal 和 messages 日志过大导致系统目录磁盘不足

事故现场情况

公司项目演示环境登录报错。

分析问题

  • 操作系统:CentOS 7,项目基于 Kubernetes 集群部署;
  • 排查业务系统问题,查看集群 kube-system 的 Pod 状态:
kubectl get pod -n kube-system

发现网络组件 calico-node 的 READY 状态为 0/1(当节点磁盘可用空间不足 20% 时,calico-node 会因磁盘资源不足无法正常就绪); * 查看磁盘使用情况:

du -h --max-depth=1 /

发现根分区系统盘占用已超过 80%(系统盘总量仅 40G); * 进一步定位目录占用:

cd /var/log
du -sh * | sort -rn

发现 /var/log 目录占用达到了 30G 左右,其中 journal 和 messages 相关日志文件每个均达 5G 左右。


journal 日志问题解决

  1. 检查当前 journal 占用的磁盘量:
journalctl --disk-usage
  1. 清理过期日志(可按保留时间或保留容量限制,例如只保留最近 2 天或最大 500M):
journalctl --vacuum-time=2d
journalctl --vacuum-size=500M
  1. 手工清理与日志轮转: 如果需要手工清理日志文件,删除前需先轮转一次 journal 日志:
systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service
  1. 配置限制持久化: 编辑 /etc/systemd/journald.conf,限制 journal 最大占用及转发策略:
SystemMaxUse=16M
ForwardToSyslog=no
  1. 重启服务并校验:
systemctl restart systemd-journald.service
journalctl --verify

messages 日志问题解决

  1. 调整 rsyslog 配置文件 /etc/rsyslog.conf: 找到以下行(约第 54 行):
*.info;mail.none;authpriv.none;cron.none /var/log/messages

修改为:

*.none /var/log/messages
  1. 重启 rsyslog 服务:
systemctl restart rsyslog
  1. 安全清空存量 messages 日志:
cat /dev/null > /var/log/messages-xxxxxx  # 指定对应的历史日志文件

验证与恢复

重启集群核心网络组件与业务 Pod:

kubectl delete pod -n kube-system -l k8s-app=calico-node

待 Pod 重启就绪后,演示环境业务系统恢复正常访问与登录。

评论