diff options
| author | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2026-02-24 00:27:21 +0530 |
|---|---|---|
| committer | Marc Pervaz Boocha <mboocha@sudomsg.com> | 2026-02-24 00:27:21 +0530 |
| commit | 710704b6ce5ad2b62fc4a44f05b5f53ef924834e (patch) | |
| tree | 85fe7f0e565cb401ae540377ef0d34fcf4ab6131 /logging/sinks/encoding.go | |
| parent | go fix 1.26 (diff) | |
| download | kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar.gz kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar.bz2 kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar.lz kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar.xz kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.tar.zst kit-710704b6ce5ad2b62fc4a44f05b5f53ef924834e.zip | |
Added more logging stuff
Diffstat (limited to 'logging/sinks/encoding.go')
| -rw-r--r-- | logging/sinks/encoding.go | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/logging/sinks/encoding.go b/logging/sinks/encoding.go new file mode 100644 index 0000000..e1c558a --- /dev/null +++ b/logging/sinks/encoding.go @@ -0,0 +1,140 @@ +package sinks + +import ( + "encoding/json" + "fmt" + "iter" + "log/slog" + "runtime" + "strings" +) + +func RecordAll(r slog.Record) iter.Seq2[string, slog.Value] { + return func(yield func(string, slog.Value) bool) { + if !r.Time.IsZero() { + if !yield(slog.TimeKey, slog.TimeValue(r.Time)) { + return + } + } + + if !yield(slog.LevelKey, slog.AnyValue(r.Level)) { + return + } + if !yield(slog.MessageKey, slog.StringValue(r.Message)) { + return + } + + if r.PC != 0 { + if !yield(slog.SourceKey, slog.Uint64Value(uint64(r.PC))) { + return + } + } + + var walkAttrs func(attrs []slog.Attr, prefix string) bool + + walkAttrs = func(attrs []slog.Attr, prefix string) bool { + for _, attr := range attrs { + key := attr.Key + if prefix != "" { + key = prefix + "." + key + } + + if attr.Value.Kind() == slog.KindGroup { + if !walkAttrs(attr.Value.Group(), key) { + return false + } + } else { + if !yield(key, attr.Value) { + return false + } + } + } + return true + } + r.Attrs(func(attr slog.Attr) bool { + return walkAttrs([]slog.Attr{attr}, "") + }) + } +} + +func LogFmtEncoder(rec slog.Record, ReplaceAttr func(string, slog.Value) (slog.Value, bool)) (string, error) { + str := []string{} + for key, value := range RecordAll(rec) { + if ReplaceAttr != nil { + ok := true + value, ok = ReplaceAttr(key, value) + if !ok { + continue + } + } + if key == slog.SourceKey { + fs := runtime.CallersFrames([]uintptr{rec.PC}) + f, _ := fs.Next() + value = slog.StringValue(fmt.Sprintf("%s:%d", f.File, f.Line)) + } + + str = append(str, fmt.Sprintf("%s=%q", key, value)) + } + + return strings.Join(str, " "), nil +} + +func insertIntoMap(m map[string]any, dottedKey string, value slog.Value) { + parts := strings.Split(dottedKey, ".") + key := parts[len(parts)-1] + parts = parts[:len(parts)-1] + currentMap := m + + for _, part := range parts { + if _, ok := currentMap[part]; !ok { + currentMap[part] = make(map[string]any) + } + + if nested, ok := currentMap[part].(map[string]any); ok { + currentMap = nested + } else { + currentMap[part] = make(map[string]any) + currentMap = currentMap[part].(map[string]any) + } + } + currentMap[key] = value.Any() +} + +func JSONEncoder(rec slog.Record, ReplaceAttr func(string, slog.Value) (slog.Value, bool)) (string, error) { + m := make(map[string]any) + for key, value := range RecordAll(rec) { + if ReplaceAttr != nil { + ok := true + value, ok = ReplaceAttr(key, value) + if !ok { + continue + } + } + insertIntoMap(m, key, value) + } + + if _, ok := m[slog.SourceKey]; ok { + fs := runtime.CallersFrames([]uintptr{rec.PC}) + f, _ := fs.Next() + m[slog.SourceKey] = fmt.Sprintf("%s:%d", f.File, f.Line) + } + + b, err := json.Marshal(m) + if err != nil { + return "", err + } + + return string(b), nil +} + +func MessageEncoder(rec slog.Record, ReplaceAttr func(string, slog.Value) (slog.Value, bool)) (string, error) { + if ReplaceAttr != nil { + value, ok := ReplaceAttr(slog.MessageKey, slog.StringValue(rec.Message)) + if !ok { + return "", nil + } + return value.String(), nil + } + + return rec.Message, nil +} |
