服务器日志悄悄涨到 4G:journald 能不能删、该怎么删

服务器日志悄悄涨到 4G:journald 能不能删、该怎么删

2026-09-28 · notes

服务器日志悄悄涨到 4G:journald 能不能删、该怎么删

📖 本文共 1,949 字,阅读需要 7 分钟

起因是一次例行看磁盘:一台 2 核 2G 的小机器上,systemd 的系统日志攒了 3.9 GB。第一反应是”这能删吗?删了会不会把服务搞挂?”——把这几个问题查清楚之后,顺手把增长也彻底止住了。这篇就是完整答案。

一、先说结论

问题 答案
能删吗 能。不动任何业务数据,不影响 nginx / MySQL / 面板
删了会丢什么 只有”事后排障的历史日志”;而且它另有文本副本
怎么删 用官方 journalctl --vacuum-*,不要 rm -rf
更该做的 给它设一个上限,从根上不再涨
现在急不急 不一定 —— 上限生效后它只有 480 MB,磁盘还有 30+ GB 空闲

二、journald 是什么,跟业务有没有关系

journald 是 systemd 的整机日志服务:内核消息、sshd 登录、cron 任务、各个 systemd 服务的输出,全都往它这儿写。默认落在系统日志目录 /var/log/journal/(持久化),配置不当或磁盘只读时才会退回内存。

关键点是它跟业务数据完全无关:

东西 在哪 和 journal 的关系
应用数据 / 数据库 / 网站文件 各自目录与 MySQL 无关,删日志不碰它们
nginx 访问与错误日志 站点日志目录下的独立文件 独立文件,不受清理影响
rsyslog 文本日志 登录日志、系统消息、定时任务日志 是另一份副本
依赖日志做自动封禁的工具(fail2ban 等) —— 没装就没有依赖

三、为什么”正好”停在 4 G

这是最反直觉的一点:journald 默认就自带上限,公式是

$$\text{SystemMaxUse} = \min\left(\text{文件系统大小的 } 10%,\ 4\ \text{GiB}\right)$$

于是在一台 59 GB 盘的机器上:10% = 5.9 GB,但被 4 GiB 封顶 → 生效上限就是 4 GiB。

也就是说它不是失控,而是攒到上限后被自己的默认策略卡住了。

反推一下时间:这台机器每天大约写 1.7 万 ~ 2.6 万条、约 14.5 MB,3.9 GB ≈ 9 个月的积累(机器 uptime 刚满一年)。

四、那 4 G 都是谁写的(实测)

统计近 7 天、共 13.8 万条:

来源 行数 占比
sshd 96,837 ≈70%
systemd 14,104 10%
CROND 12,607 9%
kernel 9,896 7%
自己的服务进程 1,061 <1%

而 sshd 那 9.7 万行里,42,922 行是公网扫描 / 爆破(Failed password、Invalid user 之类),来源集中在几个 IDC 网段。

⇒ 结论有点扎心:大部分”日志”其实是别人在扫你的机器。这也意味着删掉它几乎不心疼。

五、能不能删:三个理由

  1. 不含业务数据 —— 删它不碰任何应用数据、数据库、网站文件。
  2. 另有副本 —— rsyslog 通常也在跑,登录、系统消息、定时任务各留一份纯文本日志。
  3. 没人依赖它做自动动作 —— 没装 fail2ban 之类工具时,删日志不会解除任何封禁逻辑,也不会让防护失效。

六、正确的删法(三选一)

# ① 按大小收敛(最常用,无害)
journalctl --vacuum-size=200M

# ② 按时间保留
journalctl --vacuum-time=7d

# ③ 清空全部归档(保留当前正在写的那个文件)
journalctl --rotate && journalctl --vacuum-time=1s

不要 rm -rf /var/log/journal/*。正在写入的文件被删掉,会让 journald 处于半坏状态,还得重启它才能恢复;而且相比 --vacuum 没有任何好处。用官方命令,一行就够。

七、更该做的:设个上限,一次解决

删只解决当下,加上限才解决增长。推荐用 drop-in 覆盖配置(不要直接改主配置,方便回退):

[Journal]
SystemMaxUse=500M
SystemMaxFileSize=100M

重启 journald 后立刻生效(不需要重启机器)。实测效果:

指标 改之前 改之后
journal 占用 3.9 GB 480 MB
磁盘已用 27 GB 24 GB
以后会不会再涨 会(一路攒到 4 GiB) 不会(循环覆盖,约保留最近 1 个月)

⚠️ 重启日志服务只影响日志本身,nginx / MySQL / 业务进程都不受影响;但改完仍建议顺手验证一下其它站点还正常。

八、两个顺带发现

  1. 真正占空间的可能是别的日志:同一台机器上,某个站点的 nginx 访问日志有 230 MB,比 journal 更值得处理(面板里可以配日志切割)。
  2. 公网 IP 的机器每天都在被爆破:日志里七成是 SSH 扫描。真正该做的不是删日志,而是禁用密码登录、只留密钥,必要时再加一层自动封禁。

九、一句话总结

  • 能删:journalctl --vacuum-size=200M
  • 别 rm -rf
  • 想一劳永逸:SystemMaxUse=500M + 重启 journald
  • 但先看一眼:磁盘到底是被 journal 占的,还是被某个站点的访问日志占的

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部