@@ -2,6 +2,8 @@ package main
22
33import (
44 "context"
5+ "errors"
6+ "fmt"
57 "gopkg.in/yaml.v3"
68 "io"
79 "log/slog"
@@ -88,11 +90,20 @@ func getLogConfig(file string) (LogConfig, error) {
8890 return config , nil
8991}
9092
93+ func fallbackLogger (component string ) * slog.Logger {
94+ return slog .New (
95+ slog .NewJSONHandler (os .Stderr , & slog.HandlerOptions {Level : slog .LevelDebug }),
96+ ).With ("component" , component )
97+ }
98+
9199func createLogger (component string ) (* slog.Logger , error ) {
92100 logConfig , err := getLogConfig (LogConfigFilePath )
93101 if err != nil {
94- return nil , err
102+ fallback := fallbackLogger (component )
103+ fallback .Warn ("using fallback logger" )
104+ return fallback , fmt .Errorf ("failed to load log config: %w" , err )
95105 }
106+
96107 writerLevels := make (map [io.Writer ]slog.Level )
97108 for _ , t := range logConfig .Output .Types {
98109 switch t .Type {
@@ -102,17 +113,28 @@ func createLogger(component string) (*slog.Logger, error) {
102113 directory := logConfig .Output .Directory
103114
104115 if err := os .MkdirAll (directory , 0755 ); err != nil {
105- return nil , err
116+ fallback := fallbackLogger (component )
117+ fallback .Warn ("using fallback logger" )
118+ return fallback , fmt .Errorf ("failed to create log directory: %w" , err )
106119 }
107120
108121 filePath := filepath .Join (directory , component + ".log" )
109122 file , err := os .OpenFile (filePath , os .O_CREATE | os .O_WRONLY | os .O_APPEND , 0644 )
110123 if err != nil {
111- return nil , err
124+ fallback := fallbackLogger (component )
125+ fallback .Warn ("using fallback logger" )
126+ return fallback , fmt .Errorf ("failed to open log file %q: %w" , filePath , err )
112127 }
113128 writerLevels [file ] = levelMap [t .Level ]
114129 }
115130 }
131+
132+ if len (writerLevels ) == 0 {
133+ fallback := fallbackLogger (component )
134+ fallback .Warn ("using fallback logger" )
135+ return fallback , errors .New ("no valid log outputs configured" )
136+ }
137+
116138 handler := NewMultiHandler (writerLevels )
117139 logger := slog .New (handler ).With ("component" , component )
118140 return logger , nil
0 commit comments