postfix-log-parser 0.2.0

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation
use crate::events::qmgr::QmgrEvent;
use serde_json::{Map, Value};

/// 将Qmgr事件转换为JSON对象
pub fn format_qmgr_event(qmgr_event: &QmgrEvent) -> Map<String, Value> {
    let mut event_data = Map::new();

    match qmgr_event {
        QmgrEvent::ConfigurationWarning {
            warning_type: _,
            message,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("config_warning".to_string()),
            );
            event_data.insert("message".to_string(), Value::String(message.clone()));
        }
        QmgrEvent::MessageActive {
            queue_id,
            from,
            size,
            nrcpt,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_active".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            event_data.insert("sender".to_string(), Value::String(from.clone()));
            event_data.insert(
                "size".to_string(),
                Value::Number(serde_json::Number::from(*size)),
            );
            event_data.insert(
                "nrcpt".to_string(),
                Value::Number(serde_json::Number::from(*nrcpt)),
            );
        }
        QmgrEvent::MessageRemoved { queue_id, reason } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_removed".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            if let Some(reason_text) = reason {
                event_data.insert("reason".to_string(), Value::String(reason_text.clone()));
            }
        }
        QmgrEvent::MessageSkipped {
            queue_id,
            reason,
            status_details,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_skipped".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            event_data.insert("reason".to_string(), Value::String(reason.clone()));
            if let Some(details) = status_details {
                event_data.insert("status_details".to_string(), Value::String(details.clone()));
            }
        }
        QmgrEvent::MessageDeferred {
            queue_id,
            from,
            to,
            relay,
            delay,
            delays,
            dsn,
            status,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_deferred".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            event_data.insert("sender".to_string(), Value::String(from.clone()));
            if let Some(to_addr) = to {
                event_data.insert("recipient".to_string(), Value::String(to_addr.clone()));
            }
            if let Some(relay_info) = relay {
                event_data.insert("relay".to_string(), Value::String(relay_info.clone()));
            }
            event_data.insert("delay".to_string(), Value::String(delay.clone()));
            if let Some(delays_info) = delays {
                event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
            }
            if let Some(dsn_code) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
            }
            event_data.insert("status".to_string(), Value::String(status.clone()));
        }
        QmgrEvent::MessageSent {
            queue_id,
            from,
            to,
            relay,
            delay,
            delays,
            dsn,
            status,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_sent".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            event_data.insert("sender".to_string(), Value::String(from.clone()));
            event_data.insert("recipient".to_string(), Value::String(to.clone()));
            event_data.insert("relay".to_string(), Value::String(relay.clone()));
            event_data.insert("delay".to_string(), Value::String(delay.clone()));
            if let Some(delays_info) = delays {
                event_data.insert("delays".to_string(), Value::String(delays_info.clone()));
            }
            if let Some(dsn_code) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
            }
            event_data.insert("status".to_string(), Value::String(status.clone()));
        }
        QmgrEvent::MessageBounced {
            queue_id,
            from,
            to,
            reason,
            dsn,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("message_bounced".to_string()),
            );
            event_data.insert("queue_id".to_string(), Value::String(queue_id.clone()));
            event_data.insert("sender".to_string(), Value::String(from.clone()));
            event_data.insert("recipient".to_string(), Value::String(to.clone()));
            event_data.insert("reason".to_string(), Value::String(reason.clone()));
            if let Some(dsn_code) = dsn {
                event_data.insert("dsn".to_string(), Value::String(dsn_code.clone()));
            }
        }
        QmgrEvent::QueueStats {
            active,
            deferred,
            hold,
            incoming,
            maildrop,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("queue_stats".to_string()),
            );
            if let Some(active_count) = active {
                event_data.insert(
                    "active".to_string(),
                    Value::Number(serde_json::Number::from(*active_count)),
                );
            }
            if let Some(deferred_count) = deferred {
                event_data.insert(
                    "deferred".to_string(),
                    Value::Number(serde_json::Number::from(*deferred_count)),
                );
            }
            if let Some(hold_count) = hold {
                event_data.insert(
                    "hold".to_string(),
                    Value::Number(serde_json::Number::from(*hold_count)),
                );
            }
            if let Some(incoming_count) = incoming {
                event_data.insert(
                    "incoming".to_string(),
                    Value::Number(serde_json::Number::from(*incoming_count)),
                );
            }
            if let Some(maildrop_count) = maildrop {
                event_data.insert(
                    "maildrop".to_string(),
                    Value::Number(serde_json::Number::from(*maildrop_count)),
                );
            }
        }
        QmgrEvent::TransportStatus {
            transport,
            status,
            details,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("transport_status".to_string()),
            );
            event_data.insert("transport".to_string(), Value::String(transport.clone()));
            event_data.insert("status".to_string(), Value::String(status.clone()));
            if let Some(details_text) = details {
                event_data.insert("details".to_string(), Value::String(details_text.clone()));
            }
        }
        QmgrEvent::ResourceLimit {
            resource_type,
            current_value,
            limit_value,
            message,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("resource_limit".to_string()),
            );
            event_data.insert(
                "resource_type".to_string(),
                Value::String(resource_type.clone()),
            );
            if let Some(current) = current_value {
                event_data.insert(
                    "current_value".to_string(),
                    Value::Number(serde_json::Number::from(*current)),
                );
            }
            if let Some(limit) = limit_value {
                event_data.insert(
                    "limit_value".to_string(),
                    Value::Number(serde_json::Number::from(*limit)),
                );
            }
            event_data.insert("message".to_string(), Value::String(message.clone()));
        }
        QmgrEvent::QueueFlush {
            queue_name,
            message_count,
        } => {
            event_data.insert(
                "event_type".to_string(),
                Value::String("queue_flush".to_string()),
            );
            if let Some(name) = queue_name {
                event_data.insert("queue_name".to_string(), Value::String(name.clone()));
            }
            if let Some(count) = message_count {
                event_data.insert(
                    "message_count".to_string(),
                    Value::Number(serde_json::Number::from(*count)),
                );
            }
        }
        QmgrEvent::Other {
            event_type,
            message,
            queue_id,
        } => {
            event_data.insert("event_type".to_string(), Value::String("other".to_string()));
            event_data.insert("sub_type".to_string(), Value::String(event_type.clone()));
            event_data.insert("message".to_string(), Value::String(message.clone()));
            if let Some(id) = queue_id {
                event_data.insert("queue_id".to_string(), Value::String(id.clone()));
            }
        }
    }

    event_data
}