在 Debian 系统中,syslog 的轮转通常是通过 logrotate 工具来完成的。下面从「原理 → 配置 → 手动/自动执行 → 常见问题」给你说明。
常见 syslog 日志文件:
/var/log/syslog
/var/log/messages
/var/log/auth.log
/var/log/kern.log
如果使用的是 rsyslog(Debian 默认):
dpkg -l | grep rsyslog
Debian 的 logrotate 主配置文件:
/etc/logrotate.conf
syslog 相关配置一般在这里:
/etc/logrotate.d/rsyslog
/var/log/syslog
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
| 参数 | 含义 |
|---|---|
daily |
每天轮转 |
weekly |
每周轮转 |
monthly |
每月轮转 |
rotate N |
保留 N 个旧日志 |
compress |
压缩旧日志 |
delaycompress |
延迟一轮再压缩 |
missingok |
日志不存在不报错 |
notifempty |
空日志不轮转 |
postrotate ... endscript |
轮转后执行命令(如重启 syslog) |
syslog 是持续写文件的进程,轮转后必须通知它重新打开日志:
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
或传统方式:
postrotate
systemctl kill -s HUP rsyslog
endscript
logrotate -f /etc/logrotate.d/rsyslog
logrotate -d /etc/logrotate.d/rsyslog
ls -lh /var/log/syslog*
Debian 中由 cron / systemd timer 触发:
/etc/cron.daily/logrotate
或:
systemctl status logrotate.timer
通常 每天执行一次。
检查:
logrotate -d /etc/logrotate.d/rsyslog
确认 postrotate 生效,或手动:
systemctl restart rsyslog
可改为:
size 100M
超过 100M 就轮转。
/var/log/syslog
{
size 50M
rotate 10
compress
delaycompress
missingok
notifempty
postrotate
systemctl kill -s HUP rsyslog
endscript
}
如果你用的是 syslog-ng / journald / 容器环境,配置方式会不同,可以告诉我你的具体环境,我给你针对性方案。