postfix-log-parser 0.2.0

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

fn main() {
    let parser = MasterParser::new();
    
    println!("=== 测试所有组件的新时间格式支持 ===\n");
    
    // 测试各种组件的新时间格式日志
    let test_logs = vec![
        // QMGR 组件
        ("QMGR", "2025 Jun 16 11:06:14.897961 m01 postfix/qmgr[84]: 4bLFJP5hXGz1DGbl: removed"),
        
        // Cleanup 组件(隔离日志)
        ("Cleanup", "2025 Jun 16 11:06:14.897961 m01 postfix/cleanup[123]: 4bH9jF46N6zdgMn: hold: header X-Decision-Result: Quarantine from localhost[127.0.0.1]:34924; from=<jcb-kuHwuN9mn@loylr.com> to=<m01@zcloud.center> proto=SMTP helo=<localhost>: Mail quarantined for review"),
        
        // SMTPD 组件
        ("SMTPD", "2025 Jun 16 11:06:14.123456 mail01 postfix/smtpd[12345]: connect from client[192.168.1.100]"),
        
        // SMTP 组件
        ("SMTP", "2025 Jun 16 11:06:14.456789 mail01 postfix/smtp[12346]: 4bLFJP5hXGz1DGbl: to=<user@example.com>, relay=mx.example.com[192.168.1.200]:25, delay=0.12, delays=0.01/0.02/0.05/0.04, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as ABC123)"),
        
        // Postlogd 组件
        ("Postlogd", "2025 Jun 16 11:06:14.789012 m01 postfix/postlogd[78]: warning: /etc/postfix/main.cf, line 806: overriding earlier entry: smtpd_client_message_rate_limit=0"),
        
        // Proxymap 组件
        ("Proxymap", "2025 Jun 16 11:06:14.345678 m01 postfix/proxymap[80]: warning: /etc/postfix/main.cf, line 820: overriding earlier entry: smtpd_recipient_restrictions=permit_mynetworks"),
        
        // Sendmail 组件
        ("Sendmail", "2025 Jun 16 11:06:14.567890 m01 postfix/sendmail[180]: fatal: usage: mailq [options]"),
        
        // Anvil 组件
        ("Anvil", "2025 Jun 16 11:06:14.234567 m01 postfix/anvil[85]: statistics: max connection rate 2/60s for (smtp:192.168.2.127) at 2025 Apr 10 11:47:05.123456"),
        
        // Bounce 组件
        ("Bounce", "2025 Jun 16 11:06:14.678901 m01 postfix/bounce[90]: 4bLFJP5hXGz1DGbl: sender non-delivery notification: 4bLFJP5hXGz1DGbl"),
        
        // Pickup 组件
        ("Pickup", "2025 Jun 16 11:06:14.890123 m01 postfix/pickup[91]: 4bLFJP5hXGz1DGbl: uid=1000 from=<sender@example.com>"),
        
        // Local 组件
        ("Local", "2025 Jun 16 11:06:14.012345 m01 postfix/local[92]: 4bLFJP5hXGz1DGbl: to=<user@localhost>, relay=local, delay=0.01, delays=0.01/0.00/0.00/0.00, dsn=2.0.0, status=sent (delivered to mailbox)"),
        
        // Virtual 组件
        ("Virtual", "2025 Jun 16 11:06:14.135790 m01 postfix/virtual[93]: 4bLFJP5hXGz1DGbl: to=<user@virtual.example.com>, relay=virtual, delay=0.01, delays=0.01/0.00/0.00/0.00, dsn=2.0.0, status=sent (delivered to mailbox)"),
    ];
    
    let mut success_count = 0;
    let total_count = test_logs.len();
    
    for (component_name, log) in test_logs.iter() {
        println!("测试 {} 组件:", component_name);
        println!("日志: {}", log);
        
        let result = parser.parse(log);
        
        if result.confidence > 0.0 {
            if let Some(event) = result.event {
                println!("✅ 解析成功 (置信度: {})", result.confidence);
                println!("   时间戳: {}", event.timestamp);
                println!("   组件: {}", event.component);
                println!("   事件类型: {:?}", event.event);
                success_count += 1;
                
                // 检查时间戳是否包含毫秒
                let timestamp_str = event.timestamp.to_string();
                if timestamp_str.contains(".") {
                    println!("   ✓ 毫秒精度已保留");
                }
            }
        } else {
            println!("❌ 解析失败 (置信度: {})", result.confidence);
            for error in result.parsing_errors {
                println!("   错误: {}", error);
            }
        }
        
        println!(); // 空行分隔
    }
    
    println!("=== 测试结果汇总 ===");
    println!("成功: {}/{} 组件", success_count, total_count);
    println!("成功率: {:.1}%", (success_count as f64 / total_count as f64) * 100.0);
    
    if success_count == total_count {
        println!("🎉 所有组件都成功支持新的时间格式!");
    } else {
        println!("⚠️  还有 {} 个组件需要进一步检查", total_count - success_count);
    }
}