aboutsummaryrefslogtreecommitdiffstats
path: root/logging/sinks/encoding.go
diff options
context:
space:
mode:
authorMarc Pervaz Boocha <mboocha@sudomsg.com>2026-02-24 00:27:21 +0530
committerMarc Pervaz Boocha <mboocha@sudomsg.com>2026-02-24 00:27:21 +0530
commit710704b6ce5ad2b62fc4a44f05b5f53ef924834e (patch)
tree85fe7f0e565cb401ae540377ef0d34fcf4ab6131 /logging/sinks/encoding.go
parentgo fix 1.26 (diff)
downloadkit-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.go140
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
+}