json-handler.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package log
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "time"
  7. )
  8. type JsonHandler struct {
  9. // This is used to output JSON as it provides a more modern way and probably more efficient way
  10. // to modify log records. You can alter this in place after initing JsonHandler and before
  11. // logging to it.
  12. SlogHandler slog.Handler
  13. }
  14. func NewJsonHandler(w io.Writer) *JsonHandler {
  15. return &JsonHandler{
  16. SlogHandler: slog.NewJSONHandler(w, &slog.HandlerOptions{
  17. AddSource: false,
  18. Level: slog.LevelDebug - 4,
  19. ReplaceAttr: nil,
  20. }),
  21. }
  22. }
  23. var _ Handler = (*JsonHandler)(nil)
  24. func (me *JsonHandler) Handle(r Record) {
  25. slogLevel, ok := toSlogLevel(r.Level)
  26. if !ok {
  27. panic(r.Level)
  28. }
  29. var pc [1]uintptr
  30. r.Callers(1, pc[:])
  31. slogRecord := slog.NewRecord(time.Now(), slogLevel, r.Msg.String(), pc[0])
  32. anyNames := make([]any, 0, len(r.Names))
  33. for _, name := range r.Names {
  34. anyNames = append(anyNames, name)
  35. }
  36. slogRecord.AddAttrs(slog.Any("names", r.Names))
  37. err := me.SlogHandler.Handle(context.Background(), slogRecord)
  38. if err != nil {
  39. panic(err)
  40. }
  41. }