Skip to content

Commit 2839b43

Browse files
authored
updated log.go to include log level filtering for each subhandler (#58)
Signed-off-by: redpinecube <tara.chakkithara@icloud.com>
1 parent e33d101 commit 2839b43

2 files changed

Lines changed: 43 additions & 21 deletions

File tree

config/log.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
output:
22
types:
3-
- file
4-
- stdout
3+
- type: file
4+
level: INFO
5+
- type: stdout
6+
level: INFO
57
directory: ./logs/
68

79
components:
810
- app
911
- scheduler
10-
- supervisor
12+
- supervisor

src/log.go

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,62 @@ import (
1111

1212
const LogConfigFilePath = "../config/log.yaml"
1313

14+
var levelMap = map[string]slog.Level{
15+
"DEBUG": slog.LevelDebug,
16+
"INFO": slog.LevelInfo,
17+
"WARN": slog.LevelWarn,
18+
"ERROR": slog.LevelError,
19+
}
20+
1421
type MultiHandler struct {
1522
subHandlers []slog.Handler
16-
level slog.Level
23+
}
24+
25+
type OutputType struct {
26+
Type string `yaml:"type"`
27+
Level string `yaml:"level"`
1728
}
1829

1930
type LogConfig struct {
2031
Output struct {
21-
Types []string `yaml:"types"`
22-
Directory string `yaml:"directory"`
32+
Types []OutputType `yaml:"types"`
33+
Directory string `yaml:"directory"`
2334
} `yaml:"output"`
2435
Components []string `yaml:"components"`
2536
}
2637

27-
func NewMultiHandler(level slog.Level, writers []io.Writer) *MultiHandler {
38+
func NewMultiHandler(writerLevels map[io.Writer]slog.Level) *MultiHandler {
2839
var handlers []slog.Handler
2940

30-
for _, writer := range writers {
31-
handlers = append(handlers, slog.NewJSONHandler(writer, nil))
41+
for writer, level := range writerLevels {
42+
handlers = append(handlers, slog.NewJSONHandler(writer, &slog.HandlerOptions{Level: level}))
3243
}
3344

3445
m := MultiHandler{
35-
level: level,
3646
subHandlers: handlers,
3747
}
3848
return &m
3949
}
4050

41-
func (h *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool { return h.level <= level }
42-
func (h *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler { return h }
43-
func (h *MultiHandler) WithGroup(name string) slog.Handler { return h }
51+
func (h *MultiHandler) Enabled(ctx context.Context, level slog.Level) bool {
52+
for _, handler := range h.subHandlers {
53+
if handler.Enabled(ctx, level) {
54+
return true
55+
}
56+
}
57+
return false
58+
59+
}
60+
61+
func (h *MultiHandler) WithAttrs(attrs []slog.Attr) slog.Handler { return h }
62+
func (h *MultiHandler) WithGroup(name string) slog.Handler { return h }
4463
func (h *MultiHandler) Handle(ctx context.Context, record slog.Record) error {
4564
var err error
4665
for _, handler := range h.subHandlers {
47-
if out := handler.Handle(ctx, record); out != nil {
48-
err = out
66+
if handler.Enabled(ctx, record.Level) {
67+
if out := handler.Handle(ctx, record); out != nil {
68+
err = out
69+
}
4970
}
5071
}
5172
return err
@@ -72,11 +93,11 @@ func createLogger(component string) (*slog.Logger, error) {
7293
if err != nil {
7394
return nil, err
7495
}
75-
var writers []io.Writer
96+
writerLevels := make(map[io.Writer]slog.Level)
7697
for _, t := range logConfig.Output.Types {
77-
switch t {
98+
switch t.Type {
7899
case "stdout":
79-
writers = append(writers, os.Stdout)
100+
writerLevels[os.Stdout] = levelMap[t.Level]
80101
case "file":
81102
directory := logConfig.Output.Directory
82103

@@ -89,11 +110,10 @@ func createLogger(component string) (*slog.Logger, error) {
89110
if err != nil {
90111
return nil, err
91112
}
92-
writers = append(writers, file)
93-
113+
writerLevels[file] = levelMap[t.Level]
94114
}
95115
}
96-
handler := NewMultiHandler(slog.LevelInfo, writers)
116+
handler := NewMultiHandler(writerLevels)
97117
logger := slog.New(handler).With("component", component)
98118
return logger, nil
99119
}

0 commit comments

Comments
 (0)