Skip to content

Commit

Permalink
slogutil: imp code
Browse files Browse the repository at this point in the history
  • Loading branch information
Mizzick committed Oct 23, 2024
1 parent 75f05de commit 89f12e4
Showing 1 changed file with 28 additions and 21 deletions.
49 changes: 28 additions & 21 deletions logutil/slogutil/jsonhybrid.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
// {"severity":"NORMAL","message":"time=2024-10-22T12:09:59.525+03:00 level=INFO msg=listening prefix=websvc server=http://127.0.0.1:8181"}
type JSONHybridHandler struct {
level slog.Leveler
writer io.Writer
encoder *json.Encoder
bufTextPool *syncutil.Pool[bufferedTextHandler]
mu *sync.Mutex
textAttrs []slog.Attr
Expand All @@ -39,14 +39,17 @@ const initLineLenEst = 256
// NewJSONHybridHandler creates a new properly initialized *JSONHybridHandler.
// opts are used for the underlying text handler.
func NewJSONHybridHandler(w io.Writer, opts *slog.HandlerOptions) (h *JSONHybridHandler) {
enc := json.NewEncoder(w)
enc.SetEscapeHTML(false)

lvl := slog.LevelInfo
if opts != nil && opts.Level != nil {
lvl = opts.Level.Level()
}

return &JSONHybridHandler{
level: lvl,
writer: w,
level: lvl,
encoder: enc,
bufTextPool: syncutil.NewPool(func() (bufTextHdlr *bufferedTextHandler) {
return newBufferedTextHandler(initLineLenEst, opts)
}),
Expand Down Expand Up @@ -74,43 +77,47 @@ func (h *JSONHybridHandler) Handle(ctx context.Context, r slog.Record) (err erro

err = bufTextHdlr.handler.Handle(ctx, r)
if err != nil {
return fmt.Errorf("handling text for msg: %w", err)
return fmt.Errorf("handling text for data: %w", err)
}

msgForJSON := bufTextHdlr.buffer.String()
msg := bufTextHdlr.buffer.String()

// Remove newline.
msgForJSON = msgForJSON[:len(msgForJSON)-1]
msg = msg[:len(msg)-1]
data := newJSONHybridMessage(r.Level, msg)

h.mu.Lock()
defer h.mu.Unlock()

return h.encoder.Encode(data)
}

// jsonHybridMessage represents the data structure for *JSONHybridHandler.
type jsonHybridMessage = struct {
Severity string `json:"severity"`
Message string `json:"message"`
}

// newJSONHybridMessage returns new properly initialized message.
func newJSONHybridMessage(lvl slog.Level, msg string) (m *jsonHybridMessage) {
var severity string
if r.Level < slog.LevelError {
if lvl < slog.LevelError {
severity = "NORMAL"
} else {
severity = "ERROR"
}

data := struct {
Severity string `json:"severity"`
Message string `json:"message"`
}{
return &jsonHybridMessage{
Severity: severity,
Message: msgForJSON,
Message: msg,
}

enc := json.NewEncoder(h.writer)
enc.SetEscapeHTML(false)

h.mu.Lock()
defer h.mu.Unlock()

return enc.Encode(data)
}

// WithAttrs implements the [slog.Handler] interface for *JSONHybridHandler.
func (h *JSONHybridHandler) WithAttrs(attrs []slog.Attr) (res slog.Handler) {
return &JSONHybridHandler{
level: h.level,
writer: h.writer,
encoder: h.encoder,
bufTextPool: h.bufTextPool,
mu: h.mu,
textAttrs: append(slices.Clip(h.textAttrs), attrs...),
Expand Down

0 comments on commit 89f12e4

Please sign in to comment.