...
1
2
3
4
19
20 package sloghandler
21
22 import (
23 "context"
24 "log/slog"
25 "runtime"
26 "strings"
27 "time"
28
29 "k8s.io/klog/v2/internal/severity"
30 )
31
32 func Handle(_ context.Context, record slog.Record, groups string, printWithInfos func(file string, line int, now time.Time, err error, s severity.Severity, msg string, kvList []interface{})) error {
33 now := record.Time
34 if now.IsZero() {
35
36 now = time.Now()
37 }
38
39
40
41
42
43 level := record.Level
44 s := severity.InfoLog
45 switch {
46 case level >= slog.LevelError:
47 s = severity.ErrorLog
48 case level >= slog.LevelWarn:
49 s = severity.WarningLog
50 }
51
52 var file string
53 var line int
54 if record.PC != 0 {
55
56 fs := runtime.CallersFrames([]uintptr{record.PC})
57 f, _ := fs.Next()
58 if f.File != "" {
59 file = f.File
60 if slash := strings.LastIndex(file, "/"); slash >= 0 {
61 file = file[slash+1:]
62 }
63 line = f.Line
64 }
65 } else {
66 file = "???"
67 line = 1
68 }
69
70 kvList := make([]interface{}, 0, 2*record.NumAttrs())
71 record.Attrs(func(attr slog.Attr) bool {
72 kvList = appendAttr(groups, kvList, attr)
73 return true
74 })
75
76 printWithInfos(file, line, now, nil, s, record.Message, kvList)
77 return nil
78 }
79
80 func Attrs2KVList(groups string, attrs []slog.Attr) []interface{} {
81 kvList := make([]interface{}, 0, 2*len(attrs))
82 for _, attr := range attrs {
83 kvList = appendAttr(groups, kvList, attr)
84 }
85 return kvList
86 }
87
88 func appendAttr(groups string, kvList []interface{}, attr slog.Attr) []interface{} {
89 var key string
90 if groups != "" {
91 key = groups + "." + attr.Key
92 } else {
93 key = attr.Key
94 }
95 return append(kvList, key, attr.Value)
96 }
97
View as plain text