Postfix 日志详解:maillog 排障、队列 ID 追踪与告警

Postfix 日志完整排障指南——maillog/journalctl 日志位置、按 queue ID 串联一封邮件的完整生命周期、常见报错(relay access denied、connection refused、deferred)含义解析,以及用观测云采集邮件日志并配置退信激增、队列积压告警。

最佳实践
Postfix 日志详解:maillog 排障、队列 ID 追踪与告警技术指南封面

Postfix 的日志通过 syslog 写入系统日志(通常是 /var/log/maillog 或 /var/log/mail.log),记录了每封邮件从进入队列(cleanup)、排队(qmgr)、投递尝试(smtp/smtpd/lmtp)到最终状态(sent/deferred/bounced)的完整生命周期——邮件系统排障的核心技能,就是用一个 queue ID 把散落在日志里的多行记录串成完整故事。

核心要点速览

  • 排障万能命令:grep 'QUEUE_ID' /var/log/maillog——一个 ID 串起一封邮件的全部处理环节。
  • status=sent/deferred/bounced 三个状态词是邮件命运的终点标记;deferred 会重试,bounced 是终审。
  • 用观测云采集 Postfix 日志后,"队列积压""退信率激增""中继被拒"都能做成实时监控器告警。

Postfix 日志写在哪里?

  • RHEL/CentOS/Rocky/var/log/maillog
  • Debian/Ubuntu/var/log/mail.log
  • systemd 系统(不依赖 syslog 时):journalctl -u postfix(Postfix 3.4+ 支持 maillog_file 直接写文件)

日志由多个子进程分别写入:smtpd(接收外部连接)、cleanup(入队前处理)、qmgr(队列调度)、smtp/lmtp(外发投递)、bounce(退信生成)。

如何用 queue ID 追踪一封邮件?

每封进队的邮件分配一个十六进制 queue ID(如 4HxK2m1R3Yz9)。追踪命令:

grep '4HxK2m1R3Yz9' /var/log/maillog

典型输出按时间顺序呈现四个环节:

postfix/smtpd[1234]: 4HxK2m1R3Yz9: client=mail.example.com[203.0.113.5]
postfix/cleanup[1235]: 4HxK2m1R3Yz9: message-id=<abc@example.com>
postfix/qmgr[1236]: 4HxK2m1R3Yz9: from=<sender@example.com>, size=2413, nrcpt=1 (queue active)
postfix/smtp[1237]: 4HxK2m1R3Yz9: to=<user@dest.com>, relay=mx.dest.com[198.51.100.2]:25, delay=1.2, dsn=2.0.0, status=sent (250 OK)

读法要点status=sent + 对方 250 应答才算真正送达对方 MTA;delay 超过秒级说明链路慢;dsn 是标准投递状态码(2.x 成功、4.x 临时失败、5.x 永久失败)。

常见报错都意味着什么?

报错片段 含义 处理方向
Relay access denied 本机被当中继但收件域不在许可列表 检查 mydestination/relay_domains 与认证配置
Connection refused/timed out 对方 25 端口不通或防火墙拦截 云厂商常默认封出站 25 端口,需申请解封或走中继
status=deferred 临时失败,队列中等待重试 看紧随的原因行;postqueue -p 看积压
status=bounced 永久失败已退信 5.x DSN,常见收件人不存在/被拒收
warning: hostname ... does not resolve DNS 解析问题 检查本机 DNS、反向解析
lost connection after EHLO 对方中途断连 对方反垃圾策略或网络抖动

查看当前队列:postqueue -p;强制重发:postqueue -f;删指定邮件:postsuper -d QUEUE_ID

Postfix 日志级别与调试

postconf maillog_file(3.4+ 直写文件)、postconf debug_peer_list(对指定对端开调试日志)、-v 追加到 master.cf 中对应服务(如 smtp unix - ... smtp -v)可临时提升详细度——排完障记得改回,调试日志量极大。

观测云落地:邮件日志的采集与告警

  1. 采集:DataKit 磁盘文件采集配置监控 /var/log/maillog(或 mail.log),标注 service="postfix"
    [[inputs.logging]]
      logfiles = ["/var/log/maillog"]
      source = "postfix"
      service = "postfix"
    
    systemd 直写场景用 journal 采集或配置 maillog_file
  2. 解析:Pipeline 用 grok 提取 queue ID、from/tostatusdsndelay,并提取标准字段 timestatus(把 sent/deferred/bounced 映射为 ok/warning/error),便于统一检索。
  3. 监控器告警(监控 > 监控器 > 日志检测):
    • 队列积压:deferred 日志 15 分钟内持续增长 → 预警;
    • 退信激增:bounced 数量同比突增 → 可能是账号被盗发垃圾邮件;
    • 中继被拒Relay access denied 出现 → 配置变更预警;
    • 无日志:邮件服务器 10 分钟无日志 → Postfix 进程可能挂了。
  4. 看板:按 dsn 状态码、目标域、delay 分桶做图表,长期观察投递质量。

常见问题(FAQ)

Q:maillog 里找不到某封邮件的记录? 确认日志时间范围和轮转(mailog 可能被 logrotate 切成 maillog-日期);邮件可能根本没到达本机(先查 smtpd 的连接记录);或者被 reject 在入队前,只有 NOQUEUE: reject 行没有 queue ID。

Q:日志里大量 connect from 公开资料未说明[...] 是什么? 公网邮件服务器被全网扫描是常态,大量匿名连接尝试不影响安全(只要中继关好),但值得关注认证失败(SASL authentication failed)的暴力破解。

Q:Postfix 3.4 之后还要装 rsyslog 吗? 不必须:maillog_file=/var/log/postfix.log 可让 Postfix 直写文件,绕开 syslog;容器化部署常这么干,再把文件交给 DataKit 采集。

Q:怎么统计每天的收发量? 现成工具 pflogsumm 能按日汇总 maillog;在观测云里则直接用日志查看器的统计/DQL 按天分组计数,免装额外工具。

系列阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台