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());
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(())
}