一、先搞懂systemd-journald日志疯涨的根源与应用场景

很多刚接触Red Hat系统的开发者或运维人员,都会遇到过磁盘突然被占满的情况,翻遍/var/log却发现大部分空间被systemd-journald占了——这个系统自带的日志工具,不是存成普通的TXT文本,而是用打包好的二进制格式存日志,查询效率很高,但如果没人管,它就会“无限装”。

1.1 日志疯涨的核心场景

最常见的两种情况:一是后台服务(比如数据库、中间件)疯狂输出错误日志,比如某个定时任务死循环打印日志;二是系统没给journald设配额,它可以随便占磁盘,哪怕只剩1G也会继续存。举个简单的查看当前日志占用的命令:

# 查看systemd-journald已用的磁盘空间
journalctl --disk-usage

执行后会输出类似“Archived and active journals take up 1.2G on disk”的结果,就能直观看到它占了多少空间。

1.2 适用场景划分

要是单服务器用,而且需要快速查本地最近的日志,就用容量配额方案;如果是多服务器集群,需要统一排查跨机问题,那远程转发方案更适配。

二、给journald设容量配额,从源头限制磁盘占用

配额方案是最直接的“刹车”,不用额外装其他软件,改个配置文件就行。

2.1 核心配置参数

journald的配置文件是/etc/systemd/journald.conf,里面几个关键参数管着配额:

  • SystemMaxUse:整个journald能占用的最大磁盘空间;
  • SystemMaxFileSize:单条日志文件的最大大小,防止某一条日志过大;
  • RuntimeMaxUse:系统运行时(比如临时日志分区)的最大占用;
  • MaxRetentionSec:日志保留的最长时间,超过自动删除旧日志。

2.2 完整配置示例

修改配置文件的时候直接写死数值就行,不用算太复杂,这里给个适合中等服务器的配置:

[Journal]
# 整个journald最多用2G磁盘空间,根据服务器磁盘大小调整
SystemMaxUse=2G
# 单个日志文件最大500M,避免单日志异常打太大
SystemMaxFileSize=500M
# 临时运行时的日志最多用500M空间
RuntimeMaxUse=500M
# 日志最多保留2周,超过自动清理
MaxRetentionSec=14day

改完配置要重启journald才生效,执行命令:

# 重启systemd-journald服务,让配置生效
systemctl restart systemd-journald

2.3 配额方案的优缺点

优点是简单快,本地查日志不用跨网络,适合单服务器场景;缺点是超过配额后会自动删旧日志,万一需要查历史排查问题可能找不到,而且如果服务狂打日志,还是会瞬间把配额用完。

三、远程转发日志,实现多服务器日志集中管理

如果是多服务器集群,单台设配额还不够,最好把所有日志发到中心服务器统一存,这样本地不占空间,还能集中查问题。

3.1 转发的两种常用方式

常用的是UDP或TCP的Syslog协议,UDP快但可能丢日志,TCP可靠,推荐用TCP;另外也可以用systemd自带的journal-gatewayd,但配置稍复杂,适合大集群。

3.2 客户端(要转发的服务器)配置

客户端改/etc/systemd/journald.conf,开启转发功能,指定中心服务器的IP和端口,这里用TCP的601端口(默认是514 UDP):

[Journal]
# 开启转发到Syslog服务端
ForwardToSyslog=yes
# 指定转发的中心服务器地址和端口,替换成实际的中心服务器IP
SyslogForwardTo=tcp://192.168.1.100:601

改完重启journald,客户端就会把日志发到中心服务器了。

3.3 服务端(接收日志的服务器)配置

服务端用rsyslog接收转发过来的日志,先安装rsyslog(Red Hat一般默认装了),修改/etc/rsyslog.conf:

# 加载TCP接收日志的模块
module(load="imtcp")
# 开启TCP的601端口监听
input(type="imtcp" port="601")
# 定义日志存储模板,按服务器主机名存不同的日志文件
$template RemoteLogs,"/var/log/remote/%HOSTNAME%.log"
# 把所有收到的日志都按模板存起来
*.* ?RemoteLogs

改完重启rsyslog:

# 重启rsyslog服务,开启日志接收
systemctl restart rsyslog

3.4 远程转发方案的优缺点

优点是所有日志集中存,集群排查问题不用一台台登,本地不占空间;缺点是依赖网络,断网时客户端会把日志存在本地缓存,网络恢复后补发,另外中心服务器需要扩容存储,还要维护rsyslog的配置。

四、方案落地的注意事项和总结

4.1 必须注意的细节

  1. 改完配置一定要重启服务,journald和rsyslog的配置不会自动生效,重启后才会读新的参数;
  2. 配额的数值要结合磁盘总大小,比如服务器磁盘只有10G,别设SystemMaxUse=5G,留空间给系统运行;
  3. UDP转发适合对日志丢失不敏感的场景,比如非核心业务,核心业务一定要用TCP;
  4. 即使设了配额,也可以手动清理旧日志,用命令journalctl --vacuum-size=1G(把日志缩到1G以内)。

4.2 文章总结

遇到journald日志疯涨,先看是单服务器还是集群:单服务器用容量配额快,改完就生效;集群用远程转发,统一管理所有日志。两种方案都能解决磁盘占满的问题,选对场景就行,别盲目照搬。