邮件系统日志(mail.log)太大了怎么办?logrotate 怎么配?

邮件系统日志(mail.log)太大了怎么办?logrotate 怎么配?
问题:邮件服务器每天产生数 GB 日志(尤其是高流量 MTA),如果不加控制,/var/log/mail.log 会迅速填满磁盘,导致 SMTP 服务中断。SMTP 会话的每一次连接、认证、投递都会被记录。
标准 logrotate 配置(保存 30 天,自动压缩归档):
# /etc/logrotate.d/mail
/var/log/mail.log
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err {
    daily                 # 每天轮转一次
    rotate 30             # 保留 30 份历史归档
    missingok             # 日志文件不存在时不报错
    notifempty            # 空文件不轮转
    delaycompress         # 延迟一天压缩(方便当天排查)
    compress              # gzip 压缩
    sharedscripts         # 所有日志轮转完成后执行一次 postrotate
    postrotate
        /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
    create 0640 syslog adm
}

# 大型邮件队列相关日志(Postfix after-queue 内容过滤日志)
/var/log/mail.log {
    size 500M            # 超过 500MB 立即轮转(不管是否到 daily)
    rotate 10
    missingok
    notifempty
    delaycompress
    compress
    sharedscripts
    postrotate
        /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}
优化日志级别——从源头减少日志量:
① 生产环境 Postfix 日志级别设为 01(在 master.cf 中的服务行添加 -v 参数则返回详细级别,去掉则返回默认);
② 减少 TLS 调试信息——在 main.cf 中确保没有 debug_peer_list / debug_peer_level 等调试参数;
③ 使用 rsyslog 过滤规则,将重复的垃圾连接日志直接丢弃:
# /etc/rsyslog.d/49-mail-filter.conf
:msg, contains, "discarding EHLO keywords" ~
:msg, contains, "warning: hostname .* does not resolve to address" ~
注意:丢弃日志前确认这些信息在运维中不需要——如果可能需要用到,应改为发送到单独的低优先级日志文件。
手动触发测试:logrotate -f /etc/logrotate.d/mail 强制执行一次轮转,检查是否正常运行(无权限错误、文件生成正确)。配置完成后用 logrotate -d /etc/logrotate.d/mail(debug 模式,不实际轮转)预演验证。

📎 RFC 5424 Syslog Protocol;ITIL 4 日志管理实践