ソースを参照

feat: logger package

Fela Maslen 5 年 前
コミット
8021dc78a4
3 ファイル変更114 行追加11 行削除
  1. 47 11
      music-player/pkg/config/main.go
  2. 66 0
      music-player/pkg/logger/logger.go
  3. 1 0
      music-player/test.env

+ 47 - 11
music-player/pkg/config/main.go

@@ -1,13 +1,15 @@
 package config
 
 import (
-  "os"
-  "log"
-  "fmt"
-  "strconv"
-  "path/filepath"
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"strconv"
 
-  "github.com/joho/godotenv"
+	"github.com/joho/godotenv"
+
+	"github.com/felamaslen/go-music-player/pkg/logger"
 )
 
 func getEnvFile() (string, bool) {
@@ -23,6 +25,8 @@ func getEnvFile() (string, bool) {
   }
 }
 
+var envLoaded = false
+
 func loadEnv() {
   envFileBase, loadEnvFile := getEnvFile()
   cwd, _ := os.Getwd()
@@ -30,7 +34,9 @@ func loadEnv() {
   if loadEnvFile {
     err := godotenv.Load(envFile)
     if err != nil {
-      log.Fatal("Error loading dotenv file: ", err)
+      log.Printf("Error loading dotenv file: %v\n", err)
+    } else {
+      envLoaded = true
     }
   }
 }
@@ -62,16 +68,46 @@ func getDatabaseUrl() string {
   return databaseUrl
 }
 
+const defaultLogLevel = logger.LevelInfo
+
+func getLogLevel() logger.LogLevel {
+  level, hasLevel := os.LookupEnv("LOG_LEVEL")
+  if !hasLevel {
+    return defaultLogLevel
+  }
+  levelInt, err := strconv.Atoi(level)
+  if err != nil {
+    return defaultLogLevel
+  }
+  switch levelInt {
+  case 0:
+    return logger.LevelNone
+  case 1:
+    return logger.LevelError
+  case 2:
+    return logger.LevelWarn
+  case 3:
+    return logger.LevelInfo
+  case 4:
+    return logger.LevelVerbose
+  case 5:
+    return logger.LevelDebug
+  }
+  return defaultLogLevel
+}
+
 type config struct {
   DatabaseUrl string
+  LogLevel logger.LogLevel
 }
 
-func getConfig() config {
-  loadEnv()
+func GetConfig() config {
+  if !envLoaded {
+    loadEnv()
+  }
 
   return config{
     DatabaseUrl: getDatabaseUrl(),
+    LogLevel: getLogLevel(),
   }
 }
-
-var Config = getConfig()

+ 66 - 0
music-player/pkg/logger/logger.go

@@ -0,0 +1,66 @@
+package logger
+
+import (
+	"log"
+)
+
+type LogLevel int
+
+const (
+  LevelNone LogLevel = 0
+  LevelError LogLevel = 1
+  LevelWarn LogLevel = 2
+  LevelInfo LogLevel = 3
+  LevelVerbose LogLevel = 4
+  LevelDebug LogLevel = 5
+)
+
+type Logger struct {
+  Level LogLevel
+}
+
+func (l *Logger) Printf(str string, args ...interface{}) {
+  log.Printf(str, args...)
+}
+
+func (l *Logger) Fatal(str string, args ...interface{}) {
+  log.Fatalf(str, args...)
+}
+
+func (l *Logger) Error(str string, args ...interface {}) {
+  if l.Level >= LevelError {
+    l.Printf(str, args...)
+  }
+}
+
+func (l *Logger) Warn(str string, args ...interface {}) {
+  if l.Level >= LevelWarn {
+    l.Printf(str, args...)
+  }
+}
+
+func (l *Logger) Info(str string, args ...interface {}) {
+  if l.Level >= LevelInfo {
+    l.Printf(str, args...)
+  }
+}
+
+func (l *Logger) Verbose(str string, args ...interface {}) {
+  if l.Level >= LevelVerbose {
+    l.Printf(str, args...)
+  }
+}
+
+func (l *Logger) Debug(str string, args ...interface {}) {
+  if l.Level >= LevelDebug {
+    l.Printf(str, args...)
+  }
+}
+
+func CreateLogger(level LogLevel) *Logger {
+  var l = Logger{
+    Level: level,
+  }
+
+  return &l
+}

+ 1 - 0
music-player/test.env

@@ -3,3 +3,4 @@ POSTGRES_DATABASE=music_player_test
 POSTGRES_USER=docker
 POSTGRES_PASSWORD=docker
 POSTGRES_PORT=5417
+LOG_LEVEL=5