Add a log level config option

This commit is contained in:
David Leadbeater
2025-11-20 17:29:09 +11:00
parent 982c3321e0
commit 351d0a0c85
3 changed files with 32 additions and 2 deletions

View File

@@ -2,6 +2,7 @@
# as the intrinsic default value.
log-format = "text"
log-level = "info"
[server]
# Use "-" to disable the handler.

View File

@@ -38,6 +38,7 @@ type Config struct {
Insecure bool `toml:"-" env:"insecure"`
Features []string `toml:"features"`
LogFormat string `toml:"log-format" default:"text"`
LogLevel string `toml:"log-level" default:"info"`
Server ServerConfig `toml:"server"`
Wildcard []WildcardConfig `toml:"wildcard"`
Storage StorageConfig `toml:"storage"`

View File

@@ -12,6 +12,7 @@ import (
"os"
"runtime/debug"
"strconv"
"strings"
"time"
slogmulti "github.com/samber/slog-multi"
@@ -55,15 +56,29 @@ func InitObservability() {
logHandlers := []slog.Handler{}
logLevel := slog.LevelInfo
switch strings.ToLower(config.LogLevel) {
case "debug":
logLevel = slog.LevelDebug
case "info":
logLevel = slog.LevelInfo
case "warn":
logLevel = slog.LevelWarn
case "error":
logLevel = slog.LevelError
default:
log.Println("unknown log level", config.LogLevel)
}
switch config.LogFormat {
case "none":
// nothing to do
case "text":
logHandlers = append(logHandlers,
slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{}))
slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel}))
case "json":
logHandlers = append(logHandlers,
slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{}))
slog.NewJSONHandler(os.Stderr, &slog.HandlerOptions{Level: logLevel}))
default:
log.Println("unknown log format", config.LogFormat)
}
@@ -118,6 +133,7 @@ func InitObservability() {
if enableLogs {
logHandlers = append(logHandlers, sentryslog.Option{
AddSource: true,
LogLevel: levelsFromMinimum(logLevel),
}.NewSentryHandler(context.Background()))
}
}
@@ -125,6 +141,18 @@ func InitObservability() {
slog.SetDefault(slog.New(slogmulti.Fanout(logHandlers...)))
}
// From sentryslog, because for some reason they don't make it public.
func levelsFromMinimum(minLevel slog.Level) []slog.Level {
allLevels := []slog.Level{slog.LevelDebug, slog.LevelInfo, slog.LevelWarn, slog.LevelError, sentryslog.LevelFatal}
var result []slog.Level
for _, level := range allLevels {
if level >= minLevel {
result = append(result, level)
}
}
return result
}
func FiniObservability() {
if hasSentry() {
sentry.Flush(2 * time.Second)