Files
sofmani/logger/logger.go

124 lines
2.9 KiB
Go

package logger
import (
"fmt"
"log"
"os"
"path/filepath"
"github.com/chenasraf/sofmani/platform"
"github.com/davecgh/go-spew/spew"
"github.com/fatih/color"
)
type Logger struct {
fileLogger *log.Logger
consoleOut *log.Logger
logFile *os.File
debug bool
}
var logger *Logger
func GetLogDir() string {
var logDir string
switch platform.GetPlatform() {
case platform.PlatformLinux:
logDir = filepath.Join("var", "log", "sofmani")
case platform.PlatformMacos:
home, err := os.UserHomeDir()
if err != nil {
fmt.Printf("Could not get user home directory: %v\n", err)
panic(err)
}
logDir = filepath.Join(home, "Library", "Logs", "sofmani")
case platform.PlatformWindows:
appData := os.Getenv("APPDATA")
logDir = filepath.Join(appData, "sofmani", "Logs")
}
return logDir
}
func InitLogger(debug bool) *Logger {
logDir := GetLogDir()
filePath := filepath.Join(logDir, "sofmani.log")
if _, err := os.Stat(logDir); os.IsNotExist(err) {
err := os.MkdirAll(logDir, 0755)
if err != nil {
fmt.Printf("Could not create log directory: %v\n", err)
os.Exit(1)
}
}
logFile, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
fmt.Printf("Could not create log file: %v\n", err)
os.Exit(1)
}
// Create file and console loggers
fileLogger := log.New(logFile, "", log.LstdFlags)
consoleOut := log.New(os.Stdout, "", log.LstdFlags)
// Initialize the logger
logger = &Logger{
fileLogger: fileLogger,
consoleOut: consoleOut,
logFile: logFile,
debug: debug,
}
return logger
}
func (l *Logger) log(level string, colorizer *color.Color, format string, args ...interface{}) {
// Create timestamped message
// timestamp := time.Now().Format("2006-01-02 15:04:05")
message := fmt.Sprintf("[%s] %s", level, fmt.Sprintf(format, args...))
// Write to file
l.fileLogger.Println(message)
if level == "DEBUG" && !l.debug {
return
}
// Write to console with color
if colorizer != nil {
l.consoleOut.Println(colorizer.Sprint(message))
} else {
l.consoleOut.Println(message)
}
}
func Info(format string, args ...interface{}) {
colorBlue := color.New(color.FgBlue).Add(color.Bold)
logger.log(" INFO", colorBlue, format, args...)
}
func Warn(format string, args ...interface{}) {
colorYellow := color.New(color.FgYellow).Add(color.Bold)
logger.log(" WARN", colorYellow, format, args...)
}
func Error(format string, args ...interface{}) {
colorRed := color.New(color.FgRed).Add(color.Bold)
logger.log("ERROR", colorRed, format, args...)
}
func Debug(format string, args ...interface{}) {
colorGreen := color.New(color.FgGreen).Add(color.Bold)
logger.log("DEBUG", colorGreen, format, args...)
}
func Spew(v interface{}) {
// Print/debug the passed value (works like spew.Dump)
spewDump := spew.Sdump(v)
Debug("%s", spewDump)
}
func CloseLogger() {
if logger != nil && logger.logFile != nil {
logger.logFile.Close()
}
}