优化 Linux 的 syslog(通常指 rsyslog / syslog-ng / 传统 syslogd)可以从性能、磁盘占用、安全性、可维护性几个维度来做。下面以最常见的 rsyslog 为例,兼顾通用思路。
ps -ef | grep -E "rsyslog|syslog-ng|syslogd"
常见实现:
rsyslog(最主流,CentOS/RHEL/Ubuntu 默认)syslog-ngsyslogd(老系统)下面以 rsyslog 为主。
默认同步写磁盘,高负载会卡。
# /etc/rsyslog.conf
$WorkDirectory /var/spool/rsyslog
$ActionQueueType LinkedList
$ActionQueueFileName fwdRule1
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
作用:
防止异常程序刷爆日志。
$MaxMessageSize 64k
例如抑制 debug、auth 噪声。
*.debug;mail.none;authpriv.none;cron.none /var/log/messages
或:
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
(- 表示异步写)
避免磁盘写满。
示例 /etc/logrotate.d/syslog:
/var/log/messages {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 root root
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service
endscript
}
建议:
避免所有日志写同一文件。
auth.* /var/log/auth.log
mail.* /var/log/maillog
cron.* /var/log/cron.log
chmod 640 /var/log/*
chown root:root /var/log/messages
使用 TLS(rsyslog 支持):
# 发送端
*.* @@(o)logserver:6514
# 接收端
module(load="imtcp")
input(type="imtcp" port="6514")
*.* @@logserver.example.com:514
systemctl status rsyslog
logger "test message"
tail /var/log/messages
$ActionQueueTimeoutEnqueue 1000
syslog-ng(性能更好)❌ 把所有日志都开 debug
❌ 不配 logrotate
❌ 远程日志不加密
❌ 单文件存所有日志
如果你愿意,可以告诉我:
我可以直接给你一套可复制的配置文件。