mirror of
https://gitea.com/gitea/runner.git
synced 2026-11-05 23:05:45 +00:00
Add `act/common/logging`: a printf-style `Logger` on a slog-shaped `Handler`, with a logrus-backed handler as the only backend, plus a `logtest` handler for tests. Move the job logger onto it: `common.Logger` returns `*logging.Logger`, the job log formatters and the `Reporter` hook become handlers, and composite step IDs travel in the context. Logging is tightly coupled to logrus types (hooks, formatters, `Entry.Data`). Going through our own interface first lets the remaining call sites move over with unchanged behavior, and lets the backend be swapped for `log/slog` in one place afterwards. The global process logger and its masking formatter stay on logrus for now. Assisted-by: Codet Co-authored-by: bircni <[email protected]> Reviewed-on: https://gitea.com/gitea/runner/pulls/1295 Reviewed-by: bircni <[email protected]>
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
// Package logtest provides a Handler that keeps records in memory for assertions.
|
|
package logtest
|
|
|
|
import (
|
|
"context"
|
|
"slices"
|
|
"sync"
|
|
|
|
"gitea.com/gitea/runner/act/common/logging"
|
|
)
|
|
|
|
type store struct {
|
|
mu sync.Mutex
|
|
records []logging.Record
|
|
}
|
|
|
|
// Handler records what it receives at or above its level. Loggers derived with WithAttrs share one store.
|
|
type Handler struct {
|
|
store *store
|
|
attrs []logging.Attr
|
|
minLevel logging.Level
|
|
}
|
|
|
|
// New records from LevelInfo up, like the logger of logrus's hooks/test.
|
|
func New() *Handler {
|
|
return NewWithLevel(logging.LevelInfo)
|
|
}
|
|
|
|
func NewWithLevel(minLevel logging.Level) *Handler {
|
|
return &Handler{store: &store{}, minLevel: minLevel}
|
|
}
|
|
|
|
func (h *Handler) Enabled(_ context.Context, level logging.Level) bool { return level >= h.minLevel }
|
|
|
|
// Handle stores the record with the attributes accumulated by WithAttrs placed first.
|
|
func (h *Handler) Handle(_ context.Context, r logging.Record) error {
|
|
r.Attrs = append(slices.Clone(h.attrs), r.Attrs...)
|
|
h.store.mu.Lock()
|
|
defer h.store.mu.Unlock()
|
|
h.store.records = append(h.store.records, r)
|
|
return nil
|
|
}
|
|
|
|
func (h *Handler) WithAttrs(attrs []logging.Attr) logging.Handler {
|
|
return &Handler{store: h.store, attrs: append(slices.Clone(h.attrs), attrs...), minLevel: h.minLevel}
|
|
}
|
|
|
|
func (h *Handler) AllRecords() []logging.Record {
|
|
h.store.mu.Lock()
|
|
defer h.store.mu.Unlock()
|
|
return slices.Clone(h.store.records)
|
|
}
|
|
|
|
// LastRecord returns nil when nothing was logged.
|
|
func (h *Handler) LastRecord() *logging.Record {
|
|
h.store.mu.Lock()
|
|
defer h.store.mu.Unlock()
|
|
if len(h.store.records) == 0 {
|
|
return nil
|
|
}
|
|
r := h.store.records[len(h.store.records)-1]
|
|
return &r
|
|
}
|
|
|
|
func (h *Handler) Reset() {
|
|
h.store.mu.Lock()
|
|
defer h.store.mu.Unlock()
|
|
h.store.records = nil
|
|
}
|