起因是一次例行看磁盘:一台 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 网段。
⇒ 结论有点扎心:大部分”日志”其实是别人在扫你的机器。这也意味着删掉它几乎不心疼。
五、能不能删:三个理由
- 不含业务数据 —— 删它不碰任何应用数据、数据库、网站文件。
- 另有副本 —— rsyslog 通常也在跑,登录、系统消息、定时任务各留一份纯文本日志。
- 没人依赖它做自动动作 —— 没装 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 / 业务进程都不受影响;但改完仍建议顺手验证一下其它站点还正常。
八、两个顺带发现
- 真正占空间的可能是别的日志:同一台机器上,某个站点的 nginx 访问日志有 230 MB,比 journal 更值得处理(面板里可以配日志切割)。
- 公网 IP 的机器每天都在被爆破:日志里七成是 SSH 扫描。真正该做的不是删日志,而是禁用密码登录、只留密钥,必要时再加一层自动封禁。
九、一句话总结
- 能删:
journalctl --vacuum-size=200M - 别
rm -rf - 想一劳永逸:
SystemMaxUse=500M+ 重启 journald - 但先看一眼:磁盘到底是被 journal 占的,还是被某个站点的访问日志占的
本文章永久链接: 服务器日志悄悄涨到 4G:journald 能不能删、该怎么删

