在 Linux 下优化 syslog(通常指 rsyslog / syslog-ng / journald 等日志系统),通常目标有几个:减少磁盘 IO、控制日志体积、提高性能、保证关键日志不丢、便于排查问题。下面以最常见的 rsyslog 为主说明,同时补充 systemd-journald 的优化建议。
ps -ef | grep -E "rsyslog|syslog-ng|systemd-journal"
常见组合:
rsyslogrsyslogsystemd-journald + rsyslog编辑 /etc/rsyslog.conf 或 /etc/rsyslog.d/*.conf
*.info;mail.none;authpriv.none;cron.none /var/log/messages
:msg, contains, "timeout" stop
:programname, isequal, "dhclient" stop
stop表示不再继续处理该日志
$ActionFileEnableSync off
$ActionFileBuffered on
或 modern 写法:
action(type="omfile" file="/var/log/messages" flushInterval="5")
使用 logrotate:
/etc/logrotate.d/syslog
示例:
/var/log/messages {
daily
rotate 7
compress
missingok
notifempty
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
✅ 避免日志无限增长拖死磁盘
例如把 cron / auth 单独写盘:
authpriv.* /var/log/secure
cron.* /var/log/cron
避免所有日志挤在 messages
$WorkDirectory /var/spool/rsyslog
$ActionQueueType LinkedList
$ActionQueueFileName fwdRule1
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
作用:
如果是日志服务器:
module(load="imtcp")
input(type="imtcp" port="514")
客户端:
*.* @@logserver:514
➡ 减少本地磁盘压力
配置文件:/etc/systemd/journald.conf
[Journal]
Storage=volatile # 不写磁盘(性能最好)
# Storage=persistent
SystemMaxUse=500M
SystemKeepFree=1G
MaxRetentionSec=7day
RateLimitInterval=30s
RateLimitBurst=1000
重启:
systemctl restart systemd-journald
/var/log 到独立分区systemctl disable --now bluetooth
du -sh /var/log/*
✅ Web 服务器:
volatile✅ 数据库服务器:
如果你愿意,可以告诉我:
我可以给你一套可直接用的配置。