package daemons import ( "bufio" "io" "strings" "github.com/rs/zerolog" ) type Executor interface { PrepareMonitorExec() []string LaunchMonitor(args []string, execID string, ns string, l zerolog.Logger) } // logExecution streams lines from reader and re-logs them at the appropriate // level by inspecting the zerolog level token already present in each line. // Lines that contain " ERR " or " error" (case-insensitive) are emitted at // Error so that they are visible beyond Debug-only sinks. func logExecution(reader io.ReadCloser, l zerolog.Logger) { scanner := bufio.NewScanner(reader) // Increase buffer to 1 MB to handle wide JSON payloads. scanner.Buffer(make([]byte, 1024*1024), 1024*1024) for scanner.Scan() { line := scanner.Text() switch { case strings.Contains(line, " ERR ") || strings.Contains(line, "level=error"): l.Error().Msg(line) case strings.Contains(line, " WRN ") || strings.Contains(line, "level=warning"): l.Warn().Msg(line) case strings.Contains(line, " INF ") || strings.Contains(line, "level=info"): l.Info().Msg(line) default: l.Debug().Msg(line) } } if err := scanner.Err(); err != nil { l.Error().Err(err).Msg("log scanner error") } }