diff --git a/cmd/main.go b/cmd/main.go index 0d56351..1672d72 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,7 +1,9 @@ package main import ( + "fmt" "os" + "stump/internal/utils" "stump/internal/db" "stump/internal/logger" @@ -12,9 +14,19 @@ import ( ) func main() { - err := godotenv.Load() + utils.ParseFlags() + + var err error + + err = godotenv.Load() + if err != nil { + logger.Error("There was a problem loading the .env file: %v", err) + os.Exit(1) + } + + err = logger.Init() if err != nil { - logger.Error("There was a problem loading the .env file") + fmt.Printf("failed to initialize logger: %v\n", err) os.Exit(1) } diff --git a/internal/logger/logger.go b/internal/logger/logger.go index 458c7d6..37cc65f 100644 --- a/internal/logger/logger.go +++ b/internal/logger/logger.go @@ -1,14 +1,41 @@ package logger import ( + "fmt" "log" "os" + "path/filepath" + "stump/internal/utils" ) var l *log.Logger -func init() { - l = log.New(os.Stdout, "", log.Ldate|log.Ltime) +const logName = "stump.log" + +func Init() error { + logToFile := utils.IsFlagSet("log") + + var logOutput *os.File + + if logToFile { + logPath, err := utils.GetAppPath() + logPath = filepath.Join(logPath, logName) + + if err != nil { + return fmt.Errorf("failed to get application data path: %v", err) + } + + logOutput, err = os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + return fmt.Errorf("failed to open log file: %v", err) + } + } else { + logOutput = os.Stdout + } + + l = log.New(logOutput, "", log.Ldate|log.Ltime) + + return nil } func Info(msg string, args ...any) { diff --git a/internal/utils/flags.go b/internal/utils/flags.go new file mode 100644 index 0000000..2732b66 --- /dev/null +++ b/internal/utils/flags.go @@ -0,0 +1,15 @@ +package utils + +import ( + "flag" +) + +func ParseFlags() { + flag.Bool("log", false, "enable logging to a file") +} + +func IsFlagSet(name string) bool { + flag.Parse() + flagValue := flag.Lookup(name) + return flagValue != nil +} diff --git a/internal/utils/utils.go b/internal/utils/path.go similarity index 100% rename from internal/utils/utils.go rename to internal/utils/path.go