postfix-log-parser 0.2.0

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation
use postfix_log_parser::MasterParser;
use std::env;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<String> = env::args().collect();

    if args.len() != 2 {
        eprintln!("用法: {} <日志文件>", args[0]);
        eprintln!("\n示例:");
        eprintln!("  {} bounce_json_test.log", args[0]);
        std::process::exit(1);
    }

    let log_file = Path::new(&args[1]);

    if !log_file.exists() {
        eprintln!("❌ 错误: 文件不存在: {}", log_file.display());
        std::process::exit(1);
    }

    println!("🎯 Postfix日志JSON输出测试");
    println!("文件: {}\n", log_file.display());

    let parser = MasterParser::new();
    let file = File::open(log_file)?;
    let reader = BufReader::new(file);

    let mut parsed_events = Vec::new();
    let mut line_count = 0;

    for line in reader.lines() {
        let line = line?;
        line_count += 1;

        if line.trim().is_empty() {
            continue;
        }

        let result = parser.parse(&line);

        if result.is_success() {
            let event = result.event.as_ref().unwrap();
            parsed_events.push(event.clone());

            // 输出JSON格式
            let json = serde_json::to_string_pretty(event)?;
            println!("=== 日志行 {} ===", line_count);
            println!("原始日志: {}", line);
            println!("JSON输出:");
            println!("{}", json);
            println!();
        } else {
            println!("=== 日志行 {} (解析失败) ===", line_count);
            println!("原始日志: {}", line);
            println!(
                "错误信息: {}",
                result
                    .main_error()
                    .map_or("未知错误".to_string(), |e| e.clone())
            );
            println!("置信度: {:.2}", result.confidence);
            println!();
        }
    }

    println!("📊 解析统计:");
    println!("  总行数: {}", line_count);
    println!("  成功解析: {}", parsed_events.len());
    println!(
        "  解析成功率: {:.1}%",
        if line_count > 0 {
            parsed_events.len() as f64 / line_count as f64 * 100.0
        } else {
            0.0
        }
    );

    Ok(())
}