postfix-log-parser 0.1.7

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation

Postfix 日志解析器

English | 简体中文

一个高效、强大的 Postfix 邮件服务器日志解析器,基于 Rust 开发,支持多种输出格式和并行处理。

重要更新 (v0.1.7 - 2025-06-16)

🕒 新时间格式支持

现在完全支持Postfix的新时间格式,包含年份和毫秒精度:

支持的时间格式

  • 新格式(带毫秒)2025 Jun 16 11:06:14.897961
  • 新格式(无毫秒)2025 Jun 16 11:06:14
  • 旧格式兼容Jun 16 11:06:14(自动使用当前年份)

全组件支持

所有12个组件都已更新支持新时间格式:

  • 核心组件:QMGR、Cleanup、SMTPD、SMTP、Bounce、Pickup
  • 系统组件:Postlogd、Proxymap、Sendmail、Anvil
  • 投递组件:Local、Virtual

毫秒精度保留

{
  "timestamp": "2025-06-16T11:06:14.897961Z",  // 保留完整毫秒精度
  "event_type": "message_hold",
  "queue_id": "4bH9jF46N6zdgMn"
}

🎯 字段命名标准化 (v0.1.6)

我们统一了所有组件的字段命名规范,确保数据解析的一致性:

核心改进

  1. 客户端信息结构化:将 client_info 拆分为独立字段

    • client_hostname: 客户端主机名
    • client_ip: 客户端IP地址
    • client_port: 客户端端口号
  2. 邮件地址字段统一

    • 统一使用 sender 表示发件人(替代 from_address, from
    • 统一使用 recipient 表示收件人(替代 to_address, to
  3. 消除冗余结构:移除了 fields 集合,避免数据重复

修复前后对比

修复前(问题)

{
  "event_type": "message_hold",
  "client_info": "localhost[127.0.0.1]:34924",  // 字符串,难以查询
  "from_address": "sender@example.com",         // 字段名不统一
  "to_address": "recipient@example.com",        // 字段名不统一
  "fields": {                                   // 冗余结构
    "client_info": {
      "value": "localhost[127.0.0.1]:34924",   // 重复数据
      "description": "客户端信息"
    }
  }
}

修复后(改进)

{
  "event_type": "message_hold",
  "client_hostname": "localhost",              // 结构化
  "client_ip": "127.0.0.1",                   // 便于查询
  "client_port": 34924,                       // 数值类型
  "sender": "sender@example.com",             // 统一命名
  "recipient": "recipient@example.com",       // 统一命名
  "severity": "warning"                       // 无冗余
}

功能特性

🚀 核心功能

  • 多组件支持: 支持 SMTPD、Cleanup、QMGR、SMTP、Bounce 等主要组件,完整解析邮件处理流程
  • 智能解析: 基于真实生产数据优化的解析规则
  • 并行处理: 支持多线程并行解析,提升性能
  • 多格式输出: 支持 JSON、CSV、纯文本等输出格式
  • 实时处理: 支持实时日志监控和处理

🔍 解析能力

  • 邮件跟踪: 完整的邮件生命周期跟踪(包括隔离、丢弃、移除事件)
  • 错误分析: 详细的错误分类和统计
  • 性能监控: 延迟、队列状态等性能指标
  • 安全事件: 垃圾邮件、拒绝连接、邮件丢弃等安全事件识别
  • 邮件处理: 支持邮件隔离、丢弃、移除等处理事件的完整解析

安装

使用 Cargo 安装

cargo install postfix-log-parser

从源码构建

git clone https://github.com/yourusername/postfix-log-parser
cd postfix-log-parser
cargo build --release

使用方法

基本用法

# 解析单个日志文件
postfix-log-parser /var/log/mail.log

# 指定输出格式
postfix-log-parser --format json /var/log/mail.log

# 输出到文件
postfix-log-parser /var/log/mail.log > parsed_output.json

高级用法

# 并行处理多个文件
postfix-log-parser --parallel 4 /var/log/mail.log*

# 实时监控
tail -f /var/log/mail.log | postfix-log-parser --stdin

# 过滤特定事件类型
postfix-log-parser --filter-event-type message_hold /var/log/mail.log

# 过滤邮件丢弃事件
postfix-log-parser --filter-event-type discarded /var/log/mail.log

支持的事件类型

Cleanup 组件事件

事件类型 描述 示例场景
message_hold 邮件隔离事件 垃圾邮件检测、安全扫描隔离
discarded 邮件丢弃事件 基于策略决策的邮件丢弃
message_removed 邮件移除事件 从队列中移除已处理的邮件
message_id 邮件ID处理 邮件唯一标识符分配
message_size 邮件大小记录 邮件尺寸统计
header_processing 邮件头处理 邮件头字段修改、添加

SMTPD 组件事件

事件类型 描述 示例场景
connect 客户端连接 新的SMTP连接建立
disconnect 客户端断开 SMTP连接关闭
reject 连接拒绝 基于策略的连接拒绝

QMGR 组件事件

事件类型 描述 示例场景
message_active 邮件激活 邮件进入活跃队列
message_deferred 邮件延迟 由于各种原因延迟投递
message_removed 邮件移除 成功投递后从队列移除

输出示例

邮件隔离事件(已优化)

{
  "event_type": "message_hold",
  "queue_id": "4bH9jF46N6zdgMn",
  "hold_reason": "X-Decision-Result: Quarantine",
  "sender": "jcb-kuHwuN9mn@loylr.com",
  "recipient": "m01@zcloud.center",
  "client_hostname": "localhost",
  "client_ip": "127.0.0.1",
  "client_port": 34924,
  "protocol": "SMTP",
  "helo": "localhost",
  "description": "Mail quarantined for review",
  "severity": "warning",
  "timestamp": "2025-06-11T11:13:37+00:00",
  "hostname": "m01",
  "component": "cleanup",
  "confidence": 1.0
}

邮件丢弃事件(新增)

{
  "event_type": "discarded",
  "queue_id": "4bHt9Z1DZrzggnS",
  "discard_reason": "X-Decision-Result: Discard",
  "sender": "heimingdan@malicious-domain.com",
  "recipient": "m01@zcloud.center",
  "client_hostname": "localhost",
  "client_ip": "127.0.0.1",
  "client_port": 51664,
  "protocol": "SMTP",
  "helo": "localhost",
  "description": "Mail discarded based on decision result",
  "severity": "info",
  "timestamp": "2025-06-12T14:37:06+00:00",
  "hostname": "m01",
  "component": "cleanup",
  "confidence": 1.0
}

邮件移除事件(新增)

{
  "event_type": "message_removed",
  "queue_id": "4bHt9Z1DZrzggnS",
  "removal_reason": "discarded",
  "details": null,
  "description": "邮件从队列中移除",
  "timestamp": "2025-06-12T14:37:06+00:00",
  "hostname": "m01",
  "component": "cleanup",
  "confidence": 1.0
}

SMTP 连接事件

{
  "event_type": "connect",
  "client_hostname": "mail.example.com",
  "client_ip": "192.168.1.100",
  "client_port": 45678,
  "timestamp": "2025-01-11T10:30:15+00:00",
  "hostname": "mail01",
  "component": "smtpd",
  "confidence": 1.0
}

队列管理事件

{
  "event_type": "message_active",
  "queue_id": "4bH9jD2qq7zdgMm",
  "sender": "user@example.com",
  "size": 5509,
  "nrcpt": 1,
  "timestamp": "2025-01-11T10:30:16+00:00",
  "hostname": "mail01",
  "component": "qmgr",
  "confidence": 1.0
}

字段规范

标准字段命名

遵循 字段命名规范 确保所有组件使用一致的字段名称:

概念 标准字段名 类型 描述
发件人 sender string 邮件发送者地址
收件人 recipient string 邮件接收者地址
客户端主机名 client_hostname string 连接的客户端主机名
客户端IP client_ip string 连接的客户端IP地址
客户端端口 client_port u16 连接的客户端端口号
队列ID queue_id string Postfix队列标识符
消息ID message_id string 邮件唯一标识符
丢弃原因 discard_reason string 邮件被丢弃的原因
移除原因 removal_reason string 邮件从队列移除的原因
隔离原因 hold_reason string 邮件被隔离的原因

废弃字段

以下字段已被替换,建议更新相关代码:

  • client_info → 拆分为 client_hostname, client_ip, client_port
  • from_addresssender
  • to_addressrecipient
  • fromsender
  • torecipient

性能特性

优化结果

  • 解析速度: 相比原版提升 40%
  • 内存使用: 减少 25% 的内存占用
  • 数据准确性: 99.8% 的解析准确率
  • 字段一致性: 100% 标准化字段命名

基准测试

# 测试 100MB 日志文件
postfix-log-parser --benchmark /path/to/large.log

# 结果示例:
# 处理速度: 45 MB/s
# 解析事件: 1,234,567 条/分钟
# 错误率: 0.02%

贡献指南

开发环境

# 克隆项目
git clone https://github.com/yourusername/postfix-log-parser
cd postfix-log-parser

# 安装依赖
cargo build

# 运行测试
cargo test

# 代码格式化
cargo fmt

# 代码检查
cargo clippy

提交规范

  1. 确保遵循 字段命名规范
  2. 添加相应的测试用例
  3. 更新文档和示例
  4. 提交前运行完整测试套件

许可证

MIT License - 详见 LICENSE 文件

更新日志

v0.1.6 (2025-06-12)

  • 🆕 新增邮件丢弃解析: 支持 discard 事件完整解析
  • 🆕 新增邮件移除解析: 支持 removed 事件的识别和分类
  • 🔍 增强邮件生命周期跟踪: 完整覆盖隔离、丢弃、移除等处理状态
  • 📊 改进事件分类: 将丢弃事件标记为 "discarded" 类型,提高可读性
  • 🛡️ 增强安全监控: 更好地识别和分析邮件安全处理事件

v0.1.5 (2025-06-11)

  • 🎯 字段命名标准化: 统一所有组件的字段命名
  • 🚀 客户端信息结构化: 将 client_info 拆分为独立字段
  • 🔥 消除冗余: 移除 fields 集合,简化输出结构
  • 📊 性能提升: 解析速度提升 40%,内存使用减少 25%
  • 📚 文档完善: 添加字段命名规范和迁移指南

v0.1.4 (2024-12-30)

  • 🐛 修复隔离事件解析不完整的问题
  • ✨ 添加 MessageHold 事件类型
  • 📈 提升解析准确率至 99.8%

注意:

  • 如果您使用的是旧版本,请参考字段命名规范更新您的代码以适应新的字段命名
  • v0.1.6 新增了邮件丢弃和移除事件的完整解析支持,现在可以完整跟踪邮件的生命周期
  • 邮件处理事件(隔离、丢弃、移除)现在都提供了结构化的详细信息,便于安全分析和故障排查