Function parse_log_lines

Source
pub fn parse_log_lines<I>(log_lines: I) -> Vec<ParseResult>
where I: IntoIterator, I::Item: AsRef<str>,
Expand description

批量解析多行日志 (串行版本)

📚 高效地处理多行日志,自动重用解析器实例,比多次调用parse_log_line更加高效。 适用于中小规模数据处理,内存使用稳定可控。

§适用场景

  • 中小数据量: <10,000条日志
  • 内存受限: 低内存环境或嵌入式系统
  • 简单处理: 不需要极致性能的场景
  • 顺序保证: 需要严格保持输入输出顺序

§性能特点

  • 内存使用: 约50MB (处理大文件)
  • 处理速度: 7,990 lines/sec (基准测试)
  • CPU使用: 单核串行处理
  • 顺序保证: 输出严格按输入顺序

§参数说明

  • log_lines - 实现了IntoIterator的日志行集合,支持多种类型:
    • Vec<&str> - 字符串引用向量
    • Vec<String> - 字符串向量
    • &[&str] - 字符串引用切片
    • 任何实现了IntoIterator<Item: AsRef<str>>的类型

§返回值

返回 Vec<ParseResult> - 解析结果向量,索引与输入一一对应

§示例用法

§基础批量处理

use postfix_log_parser::parse_log_lines;

let log_lines = vec![
    "Dec 30 12:34:56 mail01 postfix/smtpd[12345]: connect from client[192.168.1.100]",
    "Dec 30 12:34:57 mail01 postfix/cleanup[12346]: 4bG4VR5z: message-id=<test@example.com>",
    "Dec 30 12:34:58 mail01 postfix/qmgr[12347]: 4bG4VR5z: from=<sender@example.com>, size=1234, nrcpt=1 (queue active)",
];

let results = parse_log_lines(log_lines);

for (i, result) in results.iter().enumerate() {
    if let Some(event) = &result.event {
        println!("行{}: {} - {}", i+1, event.component, event.event_type());
    }
}

§文件处理示例

use postfix_log_parser::parse_log_lines;
use std::fs;

fn process_log_file() -> Result<(), Box<dyn std::error::Error>> {
    let content = fs::read_to_string("/var/log/mail.log")?;
    let lines: Vec<&str> = content.lines().collect();
     
    let results = parse_log_lines(lines);
     
    let success_count = results.iter().filter(|r| r.event.is_some()).count();
    println!("成功解析: {}/{} ({:.1}%)",
             success_count, results.len(),
             (success_count as f64 / results.len() as f64) * 100.0);
              
    Ok(())
}

§错误统计示例

use postfix_log_parser::parse_log_lines;
use std::collections::HashMap;

fn analyze_parsing_errors(lines: Vec<&str>) {
    let results = parse_log_lines(lines);
    let mut error_stats: HashMap<String, u32> = HashMap::new();
     
    for result in results {
        match result.event {
            Some(_) => {
                println!("✅ 解析成功 (置信度: {:.2})", result.confidence);
            }
            None => {
                if let Some(error) = result.main_error() {
                    *error_stats.entry(error.clone()).or_insert(0) += 1;
                }
            }
        }
    }
     
    println!("📊 错误统计:");
    for (error, count) in error_stats {
        println!("  {}: {} 次", error, count);
    }
}

§💡 性能对比

处理方式1,000条10,000条100,000条推荐
多次调用parse_log_line0.1s1.2s12.5s
批量parse_log_lines0.08s0.9s9.8s
并行parse_log_lines_parallel0.05s0.2s1.4s🚀