Procházet zdrojové kódy

feat: add log-format flag

ayn2op před 1 rokem
rodič
revize
a370535cc1
2 změnil soubory, kde provedl 43 přidání a 11 odebrání
  1. 15 3
      cmd/root.go
  2. 28 8
      internal/logger/logger.go

+ 15 - 3
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")
 }

+ 28 - 8
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
 }