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"),
("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", "2025 Jun 16 11:06:14.123456 mail01 postfix/smtpd[12345]: connect from client[192.168.1.100]"),
("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", "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", "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", "2025 Jun 16 11:06:14.567890 m01 postfix/sendmail[180]: fatal: usage: mailq [options]"),
("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", "2025 Jun 16 11:06:14.678901 m01 postfix/bounce[90]: 4bLFJP5hXGz1DGbl: sender non-delivery notification: 4bLFJP5hXGz1DGbl"),
("Pickup", "2025 Jun 16 11:06:14.890123 m01 postfix/pickup[91]: 4bLFJP5hXGz1DGbl: uid=1000 from=<sender@example.com>"),
("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", "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);
}
}