from abc import ABC, abstractmethod from dataclasses import dataclass, field from datetime import datetime from enum import Enum from typing import Any, Optional class LogFormat(Enum): """Supported log formats.""" JSON = "json" SYSLOG = "syslog" APACHE = "apache" RAW = "raw" @dataclass class ParsedEntry: """Parsed log entry.""" raw_line: str format: LogFormat timestamp: Optional[str] level: Optional[str] message: str metadata: dict[str, Any] = field(default_factory=dict) severity: str = "info" def to_dict(self) -> dict: """Convert to dictionary.""" return { "raw_line": self.raw_line, "format": self.format.value, "timestamp": self.timestamp, "level": self.level, "message": self.message, "metadata": self.metadata, "severity": self.severity, } class BaseParser(ABC): """Base parser class.""" @abstractmethod def get_format(self) -> LogFormat: """Get the format this parser handles.""" pass @abstractmethod def parse(self, line: str) -> Optional[ParsedEntry]: """Parse a log line.""" pass