| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- package log
- import (
- "context"
- "io"
- "log/slog"
- "time"
- )
- type JsonHandler struct {
- // This is used to output JSON as it provides a more modern way and probably more efficient way
- // to modify log records. You can alter this in place after initing JsonHandler and before
- // logging to it.
- SlogHandler slog.Handler
- }
- func NewJsonHandler(w io.Writer) *JsonHandler {
- return &JsonHandler{
- SlogHandler: slog.NewJSONHandler(w, &slog.HandlerOptions{
- AddSource: false,
- Level: slog.LevelDebug - 4,
- ReplaceAttr: nil,
- }),
- }
- }
- var _ Handler = (*JsonHandler)(nil)
- func (me *JsonHandler) Handle(r Record) {
- slogLevel, ok := toSlogLevel(r.Level)
- if !ok {
- panic(r.Level)
- }
- var pc [1]uintptr
- r.Callers(1, pc[:])
- slogRecord := slog.NewRecord(time.Now(), slogLevel, r.Msg.String(), pc[0])
- anyNames := make([]any, 0, len(r.Names))
- for _, name := range r.Names {
- anyNames = append(anyNames, name)
- }
- slogRecord.AddAttrs(slog.Any("names", r.Names))
- err := me.SlogHandler.Handle(context.Background(), slogRecord)
- if err != nil {
- panic(err)
- }
- }
|