diff --git a/core/Taskfile.yaml b/core/Taskfile.yaml index a48b49f6..4d3ce5a0 100644 --- a/core/Taskfile.yaml +++ b/core/Taskfile.yaml @@ -5,7 +5,7 @@ tasks: dev: deps: [generate] cmds: - - go run ./cmd/ {{.CLI_ARGS}} -debug -logger=pretty + - go run ./cmd/ {{.CLI_ARGS}} -logger=pretty -level=debug env: CGO_ENABLED: "1" diff --git a/core/cmd/config.go b/core/cmd/config.go index 7bd7361a..a85dc618 100644 --- a/core/cmd/config.go +++ b/core/cmd/config.go @@ -15,6 +15,7 @@ type ServerConfig struct { // Logging settings Logger string `env:"LOGGER"` + Level string `env:"LOGGER_LEVEL"` // Timeout settings TimeoutRead time.Duration @@ -47,7 +48,8 @@ const ( DefaultDuckDBHost = "./duckdb.dev.db" // Logging constants. - DefaultLogger = "json" + DefaultLogger = "json" + DefaultLoggerLevel = "info" ) // NewServerConfig creates a new server config. @@ -56,6 +58,7 @@ func NewServerConfig() (*ServerConfig, error) { Port: DefaultPort, CacheCleanupInterval: DefaultCacheCleanupInterval, Logger: DefaultLogger, + Level: DefaultLoggerLevel, TimeoutRead: DefaultTimeoutRead, TimeoutWrite: DefaultTimeoutWrite, TimeoutIdle: DefaultTimeoutIdle, diff --git a/core/cmd/start.go b/core/cmd/start.go index c9d851a1..135da65d 100644 --- a/core/cmd/start.go +++ b/core/cmd/start.go @@ -23,7 +23,6 @@ import ( ) type StartCommand struct { - Debug bool Server ServerConfig AppDB AppDBConfig AnalyticsDB AnalyticsDBConfig @@ -55,9 +54,9 @@ func NewStartCommand() (*StartCommand, error) { // ParseFlags parses the command line flags for the start command. func (s *StartCommand) ParseFlags(args []string) error { - fs := flag.NewFlagSet("start", flag.ContinueOnError) - fs.BoolVar(&s.Debug, "debug", false, "Enable verbose debug logging") + fs := flag.NewFlagSet("start", flag.ExitOnError) fs.StringVar(&s.Server.Logger, "logger", DefaultLogger, "Logger format (json, pretty)") + fs.StringVar(&s.Server.Level, "level", DefaultLoggerLevel, "Logger level (debug, info, warn, error)") fs.Int64Var(&s.Server.Port, "port", DefaultPort, "Port to listen on") // Parse flags @@ -71,7 +70,10 @@ func (s *StartCommand) ParseFlags(args []string) error { // Run executes the start command. func (s *StartCommand) Run(ctx context.Context) error { - ctx = util.SetupLogger(ctx, s.Debug, s.Server.Logger) + ctx, err := util.SetupLogger(ctx, s.Server.Logger, s.Server.Level) + if err != nil { + return errors.Wrap(err, "failed to setup logger") + } log := zerolog.Ctx(ctx) log.Info().Msg(GetVersion()) diff --git a/core/util/logger.go b/core/util/logger.go index 2bb30e66..6916e7a5 100644 --- a/core/util/logger.go +++ b/core/util/logger.go @@ -2,25 +2,40 @@ package util import ( "context" + "fmt" "os" "github.com/rs/zerolog" ) // SetupLogger sets the default logger. -func SetupLogger(ctx context.Context, isDebug bool, logger string) context.Context { +func SetupLogger(ctx context.Context, logger string, level string) (context.Context, error) { log := zerolog.New(os.Stderr).With().Timestamp().Logger() - if logger == "pretty" { + switch logger { + case "json": + // Do nothing + case "pretty": log = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) - } else { - zerolog.TimeFieldFormat = zerolog.TimeFormatUnix + default: + return nil, fmt.Errorf("invalid logger type \"%s\"", logger) } - if isDebug { + switch level { + case "debug": log = log.Level(zerolog.DebugLevel) - log.Debug().Msg("Debug logging enabled") + log.Debug().Msg("Logging level set to debug") + case "info": + log = log.Level(zerolog.InfoLevel) + case "warn": + log = log.Level(zerolog.WarnLevel) + log.Info().Msg("Logging level set to warn") + case "error": + log = log.Level(zerolog.ErrorLevel) + log.Info().Msg("Logging level set to error") + default: + return nil, fmt.Errorf("invalid log level \"%s\"", level) } - return log.WithContext(ctx) + return log.WithContext(ctx), nil }