一、先搞懂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 必须注意的细节
- 改完配置一定要重启服务,journald和rsyslog的配置不会自动生效,重启后才会读新的参数;
- 配额的数值要结合磁盘总大小,比如服务器磁盘只有10G,别设SystemMaxUse=5G,留空间给系统运行;
- UDP转发适合对日志丢失不敏感的场景,比如非核心业务,核心业务一定要用TCP;
- 即使设了配额,也可以手动清理旧日志,用命令
journalctl --vacuum-size=1G(把日志缩到1G以内)。
4.2 文章总结
遇到journald日志疯涨,先看是单服务器还是集群:单服务器用容量配额快,改完就生效;集群用远程转发,统一管理所有日志。两种方案都能解决磁盘占满的问题,选对场景就行,别盲目照搬。
评论
围绕“Red Hat Enterprise Linux下systemd-journald日志疯涨,容量配额与远程转发方案落地”参与讨论