服务器 /var/log 日志把磁盘撑爆了,journald 轮转也不生效,怎么定位大日志并治本?
直接给处理顺序:先找到是谁在膨胀,再分清「已删除但还占着」和「真在疯长」两种形态,然后逐个治——journald 自己的封顶参数、logrotate 有没有管到第三方应用、服务句柄释放,三处对完账,爆盘才不会再犯。
第一步:定位膨胀源
du -x --max-depth=1 /var/log | sort -rh | head
从这层往下钻,两三层就能锁定大文件。要注意一个隐形大户:文件已经删了,空间却没回来——进程还握着已删除文件的句柄在写。用 lsof | grep deleted 一眼就能看到这类文件,对应的日志文件名后面带着 (deleted) 标记。
第二步:分形态处置
已删除仍占空间的:重启对应服务,句柄一释放空间立即归还。常用的 journalctl --vacuum-size=200M 只对 journald 自己管用,第三方应用的日志别指望它。
还在疯长的:看清楚是谁在写。有的应用自己管日志、自己切割,但配置的是「轮转归档」而非「轮转压缩」,旧日志一套套存着照样吃空间;有的干脆没人管,一个文件从头写到尾。常见的两个大户:应用的调试日志、数据库的错误日志——前者是有人开了调试级别忘了关,后者往往天天报同一个错、每天几百兆地写,治理先把那个反复出现的报错本身修掉,日志量立刻下去一半。
第三步:三处配置对账
journald 这边,编辑配置文件把 SystemMaxUse 设成固定值(如 200M),别依赖默认的按容量百分比估算,估算口径在小盘机器上经常放得太大。
logrotate 这边,检查配置目录里有没有覆盖到那些疯长的第三方日志;没有就补一条规则,按天轮转、保留份数、压缩归档三项写全。写规则时注意两种流派的差别:一种是让应用重新打开日志句柄(发信号通知),另一种是直接拷贝截断——选错了应用还继续往老文件里写,轮转等于白做。改完用强制轮转验证一遍,确认真的切得动、压得动。
应用这边,把调试级别的日志降回常规级别——不少爆盘事故的起点,就是有人开了调试日志忘了关。
治本三件套
一,磁盘水位告警要设在八成而不是九成五,给处理留出时间窗;二,日志接入集中收集,服务器本地只留近期滚动;三,每月巡检把各机 /var/log 的头部占用列一遍,膨胀趋势当月就掐掉;四,巡检报告里加一张「最大日志排行」,谁家日志在异常膨胀,每周一眼就能看出来。日志的病都是慢性病,拖到爆盘才治,代价就大了。
贵州诚鑫致达科技在贵州做网络维护的日常里,给每台在管服务器都配了磁盘水位与日志膨胀两项巡检,爆盘这种事,提前一周发现和当天救火是两种完全不同的体验。
企业存储选型参考|贵州诚鑫致达
做核心业务 SAN 存储与高可靠应用,群晖机型参考:UC3400 · UC3200 · SA3600。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。
服务区域|贵州诚鑫致达
贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。贵州县域市场:县城及乡镇企业存储、办公网络与监控存储。