BackGo/pkg/logger/logger.go

85 lines
2.0 KiB
Go
Raw Normal View History

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)
}
}