postfix_log_parser/lib.rs
1//! # Postfix Log Parser
2//!
3//! 一个基于组件的模块化Postfix日志解析器,采用与Postfix架构对应的设计模式。
4//!
5//! ## 快速开始
6//!
7//! ```rust
8//! use postfix_log_parser::parse_log_line;
9//!
10//! let log_line = "Oct 15 14:23:45 mail postfix/smtpd[12345]: connect from client.example.com[192.168.1.100]";
11//! let result = parse_log_line(log_line);
12//!
13//! match result.event {
14//! Some(event) => println!("解析成功: {:?}", event),
15//! None => println!("解析失败: {:?}", result.parsing_errors),
16//! }
17//! ```
18
19pub mod components;
20pub mod error;
21pub mod events;
22pub mod master_parser;
23pub mod utils;
24
25// 新增模块
26pub mod cli;
27pub mod file_processor;
28pub mod formatters;
29
30// 内部模块别名
31pub mod parsing {
32 pub use crate::error::ParseResult;
33}
34
35// 重新导出主要API
36pub use error::{ParseError, ParseResult};
37pub use events::{ComponentEvent, PostfixLogEvent};
38pub use master_parser::{BaseLogInfo, MasterParser};
39
40/// 解析单行Postfix日志的便捷函数
41///
42/// 这是最主要的公共API,用户只需调用这个函数即可完成解析
43///
44/// # Arguments
45///
46/// * `log_line` - 原始日志行
47///
48/// # Returns
49///
50/// 返回 `ParseResult` 包含解析结果和置信度信息
51///
52/// # Examples
53///
54/// ```rust
55/// use postfix_log_parser::parse_log_line;
56///
57/// let log_line = "Oct 15 14:23:45 mail postfix/smtpd[12345]: connect from client.example.com[192.168.1.100]";
58/// let result = parse_log_line(log_line);
59///
60/// if let Some(event) = result.event {
61/// println!("组件: {}", event.component);
62/// println!("时间戳: {}", event.timestamp);
63/// }
64/// ```
65pub fn parse_log_line(log_line: &str) -> ParseResult {
66 let parser = MasterParser::new();
67 parser.parse(log_line)
68}
69
70/// 批量解析多行日志
71///
72/// 对于大量日志的处理,这个函数比多次调用 `parse_log_line` 更高效
73///
74/// # Arguments
75///
76/// * `log_lines` - 日志行的迭代器
77///
78/// # Returns
79///
80/// 返回解析结果的向量
81pub fn parse_log_lines<I>(log_lines: I) -> Vec<ParseResult>
82where
83 I: IntoIterator,
84 I::Item: AsRef<str>,
85{
86 let parser = MasterParser::new();
87 log_lines
88 .into_iter()
89 .map(|line| parser.parse(line.as_ref()))
90 .collect()
91}
92
93/// 并行批量解析多行日志
94///
95/// 利用多核CPU并行处理大量日志,适用于对性能要求较高的场景
96///
97/// 注意:此功能需要启用 "parallel" feature
98#[cfg(feature = "parallel")]
99pub fn parse_log_lines_parallel<I>(log_lines: I) -> Vec<ParseResult>
100where
101 I: IntoIterator,
102 I::Item: AsRef<str> + Send,
103 I::IntoIter: Send,
104{
105 use rayon::prelude::*;
106 let parser = MasterParser::new();
107 log_lines
108 .into_iter()
109 .par_bridge()
110 .map(|line| parser.parse(line.as_ref()))
111 .collect()
112}