...
1
2
3
4
19
20 package funcr
21
22 import (
23 "context"
24 "log/slog"
25
26 "github.com/go-logr/logr"
27 )
28
29 var _ logr.SlogSink = &fnlogger{}
30
31 const extraSlogSinkDepth = 3
32
33 func (l fnlogger) Handle(_ context.Context, record slog.Record) error {
34 kvList := make([]any, 0, 2*record.NumAttrs())
35 record.Attrs(func(attr slog.Attr) bool {
36 kvList = attrToKVs(attr, kvList)
37 return true
38 })
39
40 if record.Level >= slog.LevelError {
41 l.WithCallDepth(extraSlogSinkDepth).Error(nil, record.Message, kvList...)
42 } else {
43 level := l.levelFromSlog(record.Level)
44 l.WithCallDepth(extraSlogSinkDepth).Info(level, record.Message, kvList...)
45 }
46 return nil
47 }
48
49 func (l fnlogger) WithAttrs(attrs []slog.Attr) logr.SlogSink {
50 kvList := make([]any, 0, 2*len(attrs))
51 for _, attr := range attrs {
52 kvList = attrToKVs(attr, kvList)
53 }
54 l.AddValues(kvList)
55 return &l
56 }
57
58 func (l fnlogger) WithGroup(name string) logr.SlogSink {
59 l.startGroup(name)
60 return &l
61 }
62
63
64
65 func attrToKVs(attr slog.Attr, kvList []any) []any {
66 attrVal := attr.Value.Resolve()
67 if attrVal.Kind() == slog.KindGroup {
68 groupVal := attrVal.Group()
69 grpKVs := make([]any, 0, 2*len(groupVal))
70 for _, attr := range groupVal {
71 grpKVs = attrToKVs(attr, grpKVs)
72 }
73 if attr.Key == "" {
74
75 kvList = append(kvList, grpKVs...)
76 } else {
77 kvList = append(kvList, attr.Key, PseudoStruct(grpKVs))
78 }
79 } else if attr.Key != "" {
80 kvList = append(kvList, attr.Key, attrVal.Any())
81 }
82
83 return kvList
84 }
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 func (l fnlogger) levelFromSlog(level slog.Level) int {
100 result := -level
101 if result < 0 {
102 result = 0
103 }
104 return int(result)
105 }
106
View as plain text