一、问题现象:磁盘空间告急
你有没有遇到过这种情况:服务器跑得好好的,突然收到告警,说磁盘空间快满了。你赶紧检查,发现 /var/log/journal 这个目录竟然占了十几个G,甚至几十个G。明明系统日志平时没怎么关注,怎么不知不觉就吃掉了这么多空间?尤其是在麒麟操作系统上,systemd 的日志服务 journald 默认会把所有日志保存在这个目录下,时间一长,积少成多,磁盘就被填满了。今天我们就来聊聊怎么解决这个问题,用 journalctl 这把小工具,既能把历史日志清理掉,又能设置好限流策略,让日志不再疯长。
二、日志目录为什么这么大
麒麟操作系统用的是 systemd 管理服务,系统日志和内核日志都由 journald 统一收集。默认情况下,journald 会把日志写到 /var/log/journal(如果目录存在)或者 /run/log/journal(临时目录)。前者是持久化存储,重启后日志还在;后者重启就没了。大多数生产环境为了保留日志方便排错,会开启持久化,也就是存在 /var/log/journal 里。
journald 默认不限制日志大小,也没有自动清理策略,只会在日志文件达到一定大小(默认是系统内存的 10% × 8M),但总大小没有上限。时间久了,日志就像滚雪球,越滚越大。特别是频繁输出日志的应用程序(比如数据库、Web 服务、容器日志),或者系统内核疯狂报警,journal 目录蹭蹭往上涨。
三、动手清理:journalctl 命令实战
journalctl 是查看和管理 systemd 日志的工具,清理、限流都可以用它的参数完成,比直接删文件安全又方便。
3.1 查看当前日志占用
先确认一下到底有多少日志,以及当前磁盘使用情况。打开终端,敲下面这条命令:
# 查看journal日志占用的磁盘空间
journalctl --disk-usage
输出可能是这样的:
Archived and active journals use 1.2G.
如果你看到数字很大,比如 10G 以上,那就该动手了。
也可以直接看文件夹大小确认:
# 查看/var/log/journal 目录的总大小
du -sh /var/log/journal
3.2 清理历史日志
清理日志有三种常用方式:按时间、按大小、按文件保留数量。我们一个一个来看。
示例1:只保留最近 7 天的日志,扔掉更早的
# 删除7天之前的日志
sudo journalctl --vacuum-time=7d
参数 --vacuum-time 后面跟时间单位: d 天,h 小时,m 分钟,s 秒。比如想保留最近 30 天,就写 30d。
示例2:把总日志大小限制在 500M 以内
# 清理日志,使总占用不超过500MB
sudo journalctl --vacuum-size=500M
--vacuum-size 接受 K、M、G 单位。系统会自动删除最旧的日志,直到总大小低于指定值。
示例3:保留最近的 3 个日志文件(不太常用)
# 只保留最近 3 个日志文件
sudo journalctl --vacuum-files=3
大部分场景用时间或者大小方式就够了。你可以根据服务器磁盘空间情况灵活选择。
3.3 设置日志大小限制
上面的清理是手动执行的,但日志还会继续积累。更省心的做法是让 journald 自动限制日志大小,这样它就不会超过我们设定的上限。
打开 journald 配置文件 /etc/systemd/journald.conf,找到下面这些参数,去掉前面的 # 注释,然后修改值。
# 使用 nano 或 vim 编辑配置文件
sudo vim /etc/systemd/journald.conf
在文件中添加或修改以下内容(示例是设置持久化日志的最大上限为 200MB):
# 限制日志总大小不超过200M
SystemMaxUse=200M
# 单个日志文件最大100M(默认是 8M,可以不改)
SystemMaxFileSize=100M
# 保留最近的 2 个日志文件(可选,一般配合总大小使用)
SystemMaxFiles=2
参数说明:
SystemMaxUse:指定 journal 所有日志可以占用的最大磁盘空间,超过后会自动删除最旧的日志。SystemMaxFileSize:单个日志文件的大小上限,防止单个文件过大。SystemMaxFiles:最多保留多少个日志文件。
保存文件后重启 journald 服务让配置生效:
# 重启 systemd-journald 服务
sudo systemctl restart systemd-journald
之后 journal 就会自动维持在 200M 以内,再也不用担心磁盘被撑爆。
四、预防针:配置日志限流
除了限制总大小,我们还可以给日志生成速度加个笼头。如果某个程序突然疯狂打日志,journald 默认会丢掉一些日志,防止系统 I/O 打满。但麒麟系统中默认的限流策略有点宽松,我们可以自己收紧。
4.1 理解限流参数
journald 的限流是通过“速率限制”实现的,主要有两个参数:
RateLimitIntervalSec:限流时间窗口(秒)。RateLimitBurst:在这个窗口内允许的最大日志条数(单位:条)。
默认值一般是 RateLimitIntervalSec=30s 和 RateLimitBurst=10000,也就是每 30 秒最多 10000 条日志。如果超过这个数量,多余的日志会被丢弃(记录到系统日志中的一条消息里)。这个值对于大部分应用是够的,但如果你遇到日志洪水(比如网络攻击、程序 BUG),可以调小 burst 值,或者把 interval 调大。
还有一个参数 RuntimeMaxUse / RuntimeMaxFileSize / RuntimeMaxFiles,作用跟 SystemMaxUse 类似,但针对的是运行时日志(存在 /run 下,重启即丢)。如果不用持久化日志,可以设置这些。
4.2 修改 /etc/systemd/journald.conf
打开配置文件,找到限流相关参数,修改成更适合你场景的值。比如我们希望每 10 秒最多 500 条日志,防止某个服务刷屏。
# 每10秒最多允许500条日志
RateLimitIntervalSec=10s
RateLimitBurst=500
另外,如果你希望完全关闭限流(一般不建议,除非测试),可以设置 RateLimitIntervalSec=0。通常生产环境不建议关掉,否则一个日志风暴就能把系统搞瘫。
4.3 重启服务生效
修改完配置后,同样需要重启 journald 服务:
# 重启服务
sudo systemctl restart systemd-journald
检查一下限流是否生效,可以故意跑一条高频日志测试(小心操作),或者看 /var/log/journal 下的文件有没有自动变小。一般重启后立刻生效。
五、应用场景与优缺点
应用场景:
- 服务器上运行了大量微服务,每个服务都往标准输出打日志,导致 journal 体积持续增长。
- 操作系统内核频繁报错(如磁盘坏道、内存告警),产生大量系统日志。
- 开发环境和测试服务器,经常重启服务,日志沉淀多年无人清理。
- 云服务器或物理机磁盘空间有限(比如 40G 系统盘),需要控制日志占用。
优缺点:
| 优点 | 缺点 |
|---|---|
| 使用 journalctl 清理,操作简单,无需删除具体文件,安全可靠。 | 清理或限流配置需要重启 systemd-journald 服务,会短暂中断日志记录,不过一般影响很小(几毫秒)。 |
| 限制总大小后,日志自动循环,无需人工干预。 | 如果配置过于严格(如限制太小),会丢失有用日志,排障时查不到历史记录。 |
| 限流机制能防止日志洪峰导致磁盘 I/O 被打满或系统 hang 住。 | 限流参数调整需要摸索,burst 太大会失去限流意义,太小会正常日志也被丢弃。 |
| 配置集中在一个文件,修改方便,易于自动化。 | 不熟悉 systemd 的管理员可能找不到配置文件或误删重要日志。 |
六、注意事项
- 不要直接删除 journal 目录或文件。比如
rm -rf /var/log/journal,这样会导致 journald 丢掉所有日志文件,并且再启动时可能重新创建,但之前的数据就彻底没了。更严重的是,如果系统正在写入,直接删文件可能导致 journald 崩溃或死锁。一定要用 journalctl 工具来清理。 - 修改配置前最好备份。比如把
/etc/systemd/journald.conf复制一份到/root下,万一改错了可以恢复。 - 重启服务后检查生效。可以用
journalctl --disk-usage看看日志大小是不是变小了。如果没变,检查一下有没有拼写错误或注释没去掉。 - 限流设置要谨慎。对于重要服务(如数据库日志),限流过紧可能导致关键错误日志丢失。建议先保留较宽松的 burst,观察一段时间再调整。
- 持久化日志与临时日志的选择。如果你不需要日志跨重启保留,可以关闭持久化:删除
/var/log/journal文件夹,journal 就会自动把日志存到/run/log/journal,重启自动消失。这样能省掉大量磁盘空间,但不利于排障。 - 监控配套。建议监控磁盘使用率,万一配置没生效或者日志暴增,还能及时收到告警手动处理。
七、文章总结
麒麟操作系统的 journald 日志服务虽然方便,但如果不加管理,很容易吃掉大量磁盘空间,导致系统告警甚至宕机。通过 journalctl 命令,我们可以快速查看和清理历史日志,按时间、大小或文件数量来释放空间。更进一步,修改 /etc/systemd/journald.conf 配置,设定总大小上限和限流参数,就能让日志自动循环,不再无限增长。
整个操作不需要安装额外软件,全是系统自带的工具,一个文件加上几条命令,就能省掉你很多维护烦恼。希望这篇指南能帮助你轻松管理 journal 日志,避免磁盘空间告警再次出现。记得定期检查,或者在部署新服务器时就把这些配置写好,一劳永逸。
Comments