package logger import ( "io" "log" "os" ) // LogLevel type for defining different logging levels. type LogLevel int const ( // Define different log levels. LogLevelInfo LogLevel = iota LogLevelWarning LogLevelError ) // Logger wraps the standard log.Logger from the Go standard library. // It adds additional functionality like setting log levels. type Logger struct { *log.Logger level LogLevel } // NewLogger creates a new Logger instance. By default, it logs to stdout with LogLevelInfo. func NewLogger() *Logger { return &Logger{ Logger: log.New(os.Stdout, "", log.LstdFlags), level: LogLevelInfo, } } // SetLevel changes the logging level of the Logger. func (l *Logger) SetLevel(level LogLevel) { l.level = level } // LogToFile configures the logger to log to a specified file. func (l *Logger) LogToFile(filePath string) error { file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { return err } l.SetOutput(file) return nil } // LogToStdout configures the logger to log to stdout. func (l *Logger) LogToStdout() { l.SetOutput(os.Stdout) } // LogToBoth configures the logger to log to both a file and stdout. func (l *Logger) LogToBoth(filePath string) error { file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { return err } multi := io.MultiWriter(file, os.Stdout) l.SetOutput(multi) return nil } // Info logs a message at level Info, respecting the set log level. func (l *Logger) Info(msg string) { if l.level <= LogLevelInfo { l.Println("INFO: " + msg) } } // Warning logs a message at level Warning, respecting the set log level. func (l *Logger) Warning(msg string) { if l.level <= LogLevelWarning { l.Println("WARNING: " + msg) } } // Error logs a message at level Error, respecting the set log level. func (l *Logger) Error(msg string) { if l.level <= LogLevelError { l.Println("ERROR: " + msg) } }