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 "crypto/rand" 7 "encoding/json" 8 "fmt" 9 "os" 10 "time" 11 12 "github.com/bluesky-social/go-util/pkg/telemetry" ··· 182 var runServe = &cli.Command{ 183 Name: "run", 184 Usage: "Start the cocoon PDS", 185 - Flags: []cli.Flag{}, 186 Action: func(cmd *cli.Context) error { 187 188 logger := telemetry.StartLogger(cmd) 189 telemetry.StartMetrics(cmd) 190 191 s, err := server.New(&server.Args{ 192 Logger: logger, 193 Addr: cmd.String("addr"), 194 DbName: cmd.String("db-name"), 195 DbType: cmd.String("db-type"),
··· 6 "crypto/rand" 7 "encoding/json" 8 "fmt" 9 + "log/slog" 10 "os" 11 + "strings" 12 "time" 13 14 "github.com/bluesky-social/go-util/pkg/telemetry" ··· 184 var runServe = &cli.Command{ 185 Name: "run", 186 Usage: "Start the cocoon PDS", 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 + }, 195 Action: func(cmd *cli.Context) error { 196 197 logger := telemetry.StartLogger(cmd) 198 telemetry.StartMetrics(cmd) 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 + 214 s, err := server.New(&server.Args{ 215 Logger: logger, 216 + LogLevel: level, 217 Addr: cmd.String("addr"), 218 DbName: cmd.String("db-name"), 219 DbType: cmd.String("db-type"),
+31
server/server.go
··· 92 type Args struct { 93 Logger *slog.Logger 94 95 Addr string 96 DbName string 97 DbType string ··· 123 } 124 125 type config struct { 126 Version string 127 Did string 128 Hostname string ··· 212 return t.templates.ExecuteTemplate(w, name, data) 213 } 214 215 func New(args *Args) (*Server, error) { 216 if args.Logger == nil { 217 args.Logger = slog.Default() 218 } 219 220 logger := args.Logger.With("name", "New") ··· 384 plcClient: plcClient, 385 privateKey: &pkey, 386 config: &config{ 387 Version: args.Version, 388 Did: args.Did, 389 Hostname: args.Hostname,
··· 92 type Args struct { 93 Logger *slog.Logger 94 95 + LogLevel slog.Level 96 Addr string 97 DbName string 98 DbType string ··· 124 } 125 126 type config struct { 127 + LogLevel slog.Level 128 Version string 129 Did string 130 Hostname string ··· 214 return t.templates.ExecuteTemplate(w, name, data) 215 } 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 + 238 func New(args *Args) (*Server, error) { 239 if args.Logger == nil { 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 + }) 248 } 249 250 logger := args.Logger.With("name", "New") ··· 414 plcClient: plcClient, 415 privateKey: &pkey, 416 config: &config{ 417 + LogLevel: args.LogLevel, 418 Version: args.Version, 419 Did: args.Did, 420 Hostname: args.Hostname,