2025-08-06 16:09:32 +03:00

237 lines
5.7 KiB
Go

package logger
import (
"fmt"
"io"
"log"
"os"
"sync"
)
// Level represents the severity level of a log message
type Level int
const (
// DEBUG level for detailed troubleshooting information
DEBUG Level = iota
// INFO level for general operational information
INFO
// WARN level for warning conditions
WARN
// ERROR level for error conditions
ERROR
// FATAL level for critical errors that cause the program to exit
FATAL
)
var levelNames = map[Level]string{
DEBUG: "DEBUG",
INFO: "INFO",
WARN: "WARN",
ERROR: "ERROR",
FATAL: "FATAL",
}
// String returns the string representation of the log level
func (l Level) String() string {
if name, ok := levelNames[l]; ok {
return name
}
return fmt.Sprintf("LEVEL(%d)", l)
}
// Logger is the interface that defines the logging methods
type Logger interface {
Debug(v ...interface{})
Debugf(format string, v ...interface{})
Info(v ...interface{})
Infof(format string, v ...interface{})
Warn(v ...interface{})
Warnf(format string, v ...interface{})
Error(v ...interface{})
Errorf(format string, v ...interface{})
Fatal(v ...interface{})
Fatalf(format string, v ...interface{})
SetLevel(level Level)
GetLevel() Level
SetOutput(w io.Writer)
}
// DefaultLogger is the standard implementation of the Logger interface
type DefaultLogger struct {
mu sync.Mutex
logger *log.Logger
level Level
}
// NewDefaultLogger creates a new DefaultLogger with the specified level
func NewDefaultLogger(level Level) *DefaultLogger {
return &DefaultLogger{
logger: log.New(os.Stdout, "", log.LstdFlags),
level: level,
}
}
// SetOutput sets the output destination for the logger
func (l *DefaultLogger) SetOutput(w io.Writer) {
l.mu.Lock()
defer l.mu.Unlock()
l.logger.SetOutput(w)
}
// SetLevel sets the minimum log level that will be output
func (l *DefaultLogger) SetLevel(level Level) {
l.mu.Lock()
defer l.mu.Unlock()
l.level = level
}
// GetLevel returns the current log level
func (l *DefaultLogger) GetLevel() Level {
l.mu.Lock()
defer l.mu.Unlock()
return l.level
}
// log logs a message at the specified level
func (l *DefaultLogger) log(level Level, v ...interface{}) {
if level < l.level {
return
}
l.mu.Lock()
defer l.mu.Unlock()
l.logger.Print(fmt.Sprintf("[%s] ", level), fmt.Sprint(v...))
}
// logf logs a formatted message at the specified level
func (l *DefaultLogger) logf(level Level, format string, v ...interface{}) {
if level < l.level {
return
}
l.mu.Lock()
defer l.mu.Unlock()
l.logger.Print(fmt.Sprintf("[%s] %s", level, fmt.Sprintf(format, v...)))
}
// Debug logs a message at DEBUG level
func (l *DefaultLogger) Debug(v ...interface{}) {
l.log(DEBUG, v...)
}
// Debugf logs a formatted message at DEBUG level
func (l *DefaultLogger) Debugf(format string, v ...interface{}) {
l.logf(DEBUG, format, v...)
}
// Info logs a message at INFO level
func (l *DefaultLogger) Info(v ...interface{}) {
l.log(INFO, v...)
}
// Infof logs a formatted message at INFO level
func (l *DefaultLogger) Infof(format string, v ...interface{}) {
l.logf(INFO, format, v...)
}
// Warn logs a message at WARN level
func (l *DefaultLogger) Warn(v ...interface{}) {
l.log(WARN, v...)
}
// Warnf logs a formatted message at WARN level
func (l *DefaultLogger) Warnf(format string, v ...interface{}) {
l.logf(WARN, format, v...)
}
// Error logs a message at ERROR level
func (l *DefaultLogger) Error(v ...interface{}) {
l.log(ERROR, v...)
}
// Errorf logs a formatted message at ERROR level
func (l *DefaultLogger) Errorf(format string, v ...interface{}) {
l.logf(ERROR, format, v...)
}
// Fatal logs a message at FATAL level and then exits the program
func (l *DefaultLogger) Fatal(v ...interface{}) {
l.log(FATAL, v...)
os.Exit(1)
}
// Fatalf logs a formatted message at FATAL level and then exits the program
func (l *DefaultLogger) Fatalf(format string, v ...interface{}) {
l.logf(FATAL, format, v...)
os.Exit(1)
}
// Global logger instance
var (
defaultLogger Logger = NewDefaultLogger(INFO)
)
// SetDefaultLogger sets the global default logger
func SetDefaultLogger(logger Logger) {
defaultLogger = logger
}
// GetDefaultLogger returns the global default logger
func GetDefaultLogger() Logger {
return defaultLogger
}
// SetLevel sets the log level for the default logger
func SetLevel(level Level) {
defaultLogger.SetLevel(level)
}
// Debug logs a message at DEBUG level using the default logger
func Debug(v ...interface{}) {
defaultLogger.Debug(v...)
}
// Debugf logs a formatted message at DEBUG level using the default logger
func Debugf(format string, v ...interface{}) {
defaultLogger.Debugf(format, v...)
}
// Info logs a message at INFO level using the default logger
func Info(v ...interface{}) {
defaultLogger.Info(v...)
}
// Infof logs a formatted message at INFO level using the default logger
func Infof(format string, v ...interface{}) {
defaultLogger.Infof(format, v...)
}
// Warn logs a message at WARN level using the default logger
func Warn(v ...interface{}) {
defaultLogger.Warn(v...)
}
// Warnf logs a formatted message at WARN level using the default logger
func Warnf(format string, v ...interface{}) {
defaultLogger.Warnf(format, v...)
}
// Error logs a message at ERROR level using the default logger
func Error(v ...interface{}) {
defaultLogger.Error(v...)
}
// Errorf logs a formatted message at ERROR level using the default logger
func Errorf(format string, v ...interface{}) {
defaultLogger.Errorf(format, v...)
}
// Fatal logs a message at FATAL level using the default logger and then exits
func Fatal(v ...interface{}) {
defaultLogger.Fatal(v...)
}
// Fatalf logs a formatted message at FATAL level using the default logger and then exits
func Fatalf(format string, v ...interface{}) {
defaultLogger.Fatalf(format, v...)
}