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 日志
        "2025 Jun 16 11:06:14.897961 m01 postfix/qmgr[84]: 4bLFJP5hXGz1DGbl: removed",
        
        // 新格式 隔离日志
        "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 连接日志
        "2025 Jun 16 11:06:14.123456 mail01 postfix/smtpd[12345]: connect from client[192.168.1.100]",
        
        // 旧格式兼容性测试
        "Jun 16 11:06:14 m01 postfix/qmgr[84]: 4bLFJP5hXGz1DGbl: removed",
        
        // 新格式但没有毫秒
        "2025 Jun 16 11:06:14 m01 postfix/qmgr[84]: 4bLFJP5hXGz1DGbl: removed",
    ];
    
    for (i, log) in test_logs.iter().enumerate() {
        println!("测试 {}: {}", i + 1, 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);
                
                // 输出JSON格式
                match serde_json::to_string(&event) {
                    Ok(json) => {
                        // 格式化JSON输出(截断过长的内容)
                        let json_preview = if json.len() > 200 {
                            format!("{}...", &json[..200])
                        } else {
                            json
                        };
                        println!("   JSON: {}", json_preview);
                    },
                    Err(e) => println!("   JSON序列化失败: {}", e),
                }
            }
        } else {
            println!("❌ 解析失败 (置信度: {})", result.confidence);
            for error in result.parsing_errors {
                println!("   错误: {}", error);
            }
        }
        
        println!(); // 空行分隔
    }
    
    println!("=== 测试完成 ===");
}