Vow, uncensorable PDS written in Go

feat: log level configuration (#60)

* feat: log level configuration

Add a new `--log-level` flag to configure the logging level for the
server. The flag accepts values: debug, info, warn, and error. The
default log level is set to info. The log level is passed to the server
and used to filter log messages based on the configured level.

* fix: log level arg

authored by shi.gg and committed by

GitHub efb83a84 0908053f

+56 -1
+25 -1
cmd/cocoon/main.go
··· 6 6 "crypto/rand" 7 7 "encoding/json" 8 8 "fmt" 9 + "log/slog" 9 10 "os" 11 + "strings" 10 12 "time" 11 13 12 14 "github.com/bluesky-social/go-util/pkg/telemetry" ··· 182 184 var runServe = &cli.Command{ 183 185 Name: "run", 184 186 Usage: "Start the cocoon PDS", 185 - Flags: []cli.Flag{}, 187 + Flags: []cli.Flag{ 188 + &cli.StringFlag{ 189 + Name: "log-level", 190 + Usage: "Log level: debug, info, warn, error", 191 + EnvVars: []string{"COCOON_LOG_LEVEL", "LOG_LEVEL"}, 192 + Value: "info", 193 + }, 194 + }, 186 195 Action: func(cmd *cli.Context) error { 187 196 188 197 logger := telemetry.StartLogger(cmd) 189 198 telemetry.StartMetrics(cmd) 190 199 200 + var level slog.Level 201 + switch strings.ToLower(cmd.String("log-level")) { 202 + case "debug": 203 + level = slog.LevelDebug 204 + case "info": 205 + level = slog.LevelInfo 206 + case "warn": 207 + level = slog.LevelWarn 208 + case "error": 209 + level = slog.LevelError 210 + default: 211 + level = slog.LevelInfo 212 + } 213 + 191 214 s, err := server.New(&server.Args{ 192 215 Logger: logger, 216 + LogLevel: level, 193 217 Addr: cmd.String("addr"), 194 218 DbName: cmd.String("db-name"), 195 219 DbType: cmd.String("db-type"),
+31
server/server.go
··· 92 92 type Args struct { 93 93 Logger *slog.Logger 94 94 95 + LogLevel slog.Level 95 96 Addr string 96 97 DbName string 97 98 DbType string ··· 123 124 } 124 125 125 126 type config struct { 127 + LogLevel slog.Level 126 128 Version string 127 129 Did string 128 130 Hostname string ··· 212 214 return t.templates.ExecuteTemplate(w, name, data) 213 215 } 214 216 217 + type filteredHandler struct { 218 + level slog.Level 219 + handler slog.Handler 220 + } 221 + 222 + func (h *filteredHandler) Enabled(ctx context.Context, level slog.Level) bool { 223 + return level >= h.level && h.handler.Enabled(ctx, level) 224 + } 225 + 226 + func (h *filteredHandler) Handle(ctx context.Context, r slog.Record) error { 227 + return h.handler.Handle(ctx, r) 228 + } 229 + 230 + func (h *filteredHandler) WithAttrs(attrs []slog.Attr) slog.Handler { 231 + return &filteredHandler{level: h.level, handler: h.handler.WithAttrs(attrs)} 232 + } 233 + 234 + func (h *filteredHandler) WithGroup(name string) slog.Handler { 235 + return &filteredHandler{level: h.level, handler: h.handler.WithGroup(name)} 236 + } 237 + 215 238 func New(args *Args) (*Server, error) { 216 239 if args.Logger == nil { 217 240 args.Logger = slog.Default() 241 + } 242 + 243 + if args.LogLevel != 0 { 244 + args.Logger = slog.New(&filteredHandler{ 245 + level: args.LogLevel, 246 + handler: args.Logger.Handler(), 247 + }) 218 248 } 219 249 220 250 logger := args.Logger.With("name", "New") ··· 384 414 plcClient: plcClient, 385 415 privateKey: &pkey, 386 416 config: &config{ 417 + LogLevel: args.LogLevel, 387 418 Version: args.Version, 388 419 Did: args.Did, 389 420 Hostname: args.Hostname,