release / govulncheck (push) Successful in 17s
release / web (push) Successful in 1m35s
release / go (push) Successful in 2m0s
release / integration (push) Successful in 5m40s
release / android (push) Successful in 6m15s
release / Build signed APK (releases and dev) (push) Successful in 6m30s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 25s
release / Verify release artifacts (tag releases only) (push) Skipped
The version moves to internal/buildinfo, so /rest/ping reports the build instead of "dev". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
949 B
Go
44 lines
949 B
Go
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"log/slog"
|
|
"strings"
|
|
)
|
|
|
|
func New(w io.Writer, level, format string) (*slog.Logger, error) {
|
|
lvl, err := parseLevel(level)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
opts := &slog.HandlerOptions{Level: lvl}
|
|
|
|
var h slog.Handler
|
|
switch strings.ToLower(format) {
|
|
case "", "text":
|
|
h = slog.NewTextHandler(w, opts)
|
|
case "json":
|
|
h = slog.NewJSONHandler(w, opts)
|
|
default:
|
|
return nil, fmt.Errorf("unknown log format %q (want text|json)", format)
|
|
}
|
|
// Errors are also kept for the admin Overview (M504).
|
|
return slog.New(newRingHandler(h, Errors)), nil
|
|
}
|
|
|
|
func parseLevel(s string) (slog.Level, error) {
|
|
switch strings.ToLower(strings.TrimSpace(s)) {
|
|
case "", "info":
|
|
return slog.LevelInfo, nil
|
|
case "debug":
|
|
return slog.LevelDebug, nil
|
|
case "warn", "warning":
|
|
return slog.LevelWarn, nil
|
|
case "error":
|
|
return slog.LevelError, nil
|
|
default:
|
|
return 0, fmt.Errorf("unknown log level %q", s)
|
|
}
|
|
}
|