Skip to content

Commit c5e20b8

Browse files
committed
improved error handling for createLogger
Signed-off-by: redpinecube <tara.chakkithara@icloud.com>
1 parent 2839b43 commit c5e20b8

2 files changed

Lines changed: 26 additions & 3 deletions

File tree

src/log.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
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+
9199
func 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

src/log_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package main

0 commit comments

Comments
 (0)