邮件系统日志(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 日志级别设为
② 减少 TLS 调试信息——在
③ 使用
① 生产环境 Postfix 日志级别设为
0 或 1(在 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 日志管理实践
