package parser import "time" type LogEntry struct { Timestamp time.Time ContainerID string Container string Level string TraceID string SpanID string Message string Fields map[string]any Raw string } type Parser interface { // Parse converts a raw log line into a structured LogEntry. // Returns (entry, true) on success, (zero LogEntry, false) if the input cannot be parsed. Parse(raw string) (LogEntry, bool) } type Chain []Parser func (c Chain) Parse(raw string) (LogEntry, bool) { for _, p := range c { if entry, ok := p.Parse(raw); ok { return entry, true } } return rawFallback(raw), true } type NoopParser struct{} func (NoopParser) Parse(raw string) (LogEntry, bool) { return rawFallback(raw), true } func rawFallback(raw string) LogEntry { return LogEntry{Raw: raw, Message: raw, Timestamp: time.Now()} }