From a370535cc1a8b3d88bfa37fe7d253cb6cd2ccd89 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Wed, 30 Apr 2025 16:43:03 -0400 Subject: [PATCH] feat: add log-format flag --- cmd/root.go | 18 +++++++++++++++--- internal/logger/logger.go | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 6a19332..3defebd 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -20,8 +20,10 @@ var ( var ( rootCmd = &cobra.Command{ PreRunE: func(cmd *cobra.Command, args []string) error { + flags := cmd.Flags() + var level slog.Level - switch str, _ := cmd.Flags().GetString("log-level"); str { + switch s, _ := flags.GetString("log-level"); s { case "debug": level = slog.LevelDebug case "info": @@ -32,7 +34,15 @@ var ( level = slog.LevelError } - return logger.Load(level) + var format logger.Format + switch s, _ := flags.GetString("log-format"); s { + case "text": + format = logger.FormatText + case "json": + format = logger.FormatJson + } + + return logger.Load(format, level) }, RunE: func(cmd *cobra.Command, args []string) error { @@ -77,5 +87,7 @@ var ( func init() { flags := rootCmd.Flags() flags.StringP("token", "t", "", "the authentication token") - flags.StringP("log-level", "l", "info", "log level") + + flags.String("log-level", "info", "log level") + flags.String("log-format", "text", "log format") } diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 2cb743c..2dd9a54 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -8,10 +8,15 @@ import ( "github.com/ayn2op/discordo/internal/consts" ) -const fileName = "logs.txt" +type Format int + +const ( + FormatText Format = iota + FormatJson +) // Opens the log file and configures default logger. -func Load(level slog.Level) error { +func Load(format Format, level slog.Level) error { path, err := os.UserCacheDir() if err != nil { return err @@ -22,13 +27,28 @@ func Load(level slog.Level) error { return err } - path = filepath.Join(path, fileName) - file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, os.ModePerm) - if err != nil { - return err + opts := &slog.HandlerOptions{AddSource: true, Level: level} + + var h slog.Handler + switch format { + case FormatText: + path := filepath.Join(path, "logs.txt") + file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, os.ModePerm) + if err != nil { + return err + } + + h = slog.NewTextHandler(file, opts) + case FormatJson: + path := filepath.Join(path, "logs.json") + file, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY, os.ModePerm) + if err != nil { + return err + } + + h = slog.NewJSONHandler(file, opts) } - l := slog.New(slog.NewTextHandler(file, &slog.HandlerOptions{AddSource: true, Level: level})) - slog.SetDefault(l) + slog.SetDefault(slog.New(h)) return nil }