This commit is contained in:
2025-09-16 14:27:34 +03:00
commit afeb139f5a
21 changed files with 4714 additions and 0 deletions

83
pkg/utils/logger.go Normal file
View File

@@ -0,0 +1,83 @@
package utils
import (
"io"
"log/slog"
"os"
"time"
)
// Logger provides structured logging capabilities
type Logger struct {
*slog.Logger
}
// NewLogger creates a new structured logger
func NewLogger() *Logger {
return NewLoggerWithOutput(os.Stdout)
}
// NewDebugLogger creates a new logger with debug level enabled
func NewDebugLogger() *Logger {
opts := &slog.HandlerOptions{
Level: slog.LevelDebug,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// Customize timestamp format
if a.Key == slog.TimeKey {
return slog.Attr{
Key: a.Key,
Value: slog.StringValue(time.Now().Format("2006-01-02 15:04:05")),
}
}
return a
},
}
handler := slog.NewTextHandler(os.Stdout, opts)
logger := slog.New(handler)
return &Logger{Logger: logger}
}
// NewLoggerWithOutput creates a new logger with custom output
func NewLoggerWithOutput(w io.Writer) *Logger {
opts := &slog.HandlerOptions{
Level: slog.LevelInfo,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// Customize timestamp format
if a.Key == slog.TimeKey {
return slog.Attr{
Key: a.Key,
Value: slog.StringValue(time.Now().Format("2006-01-02 15:04:05")),
}
}
return a
},
}
handler := slog.NewTextHandler(w, opts)
logger := slog.New(handler)
return &Logger{Logger: logger}
}
// NewSilentLogger creates a logger that discards all output
func NewSilentLogger() *Logger {
return NewLoggerWithOutput(io.Discard)
}
// WithComponent adds a component context to the logger
func (l *Logger) WithComponent(component string) *Logger {
return &Logger{Logger: l.Logger.With("component", component)}
}
// WithRequestID adds a request ID context to the logger
func (l *Logger) WithRequestID(requestID string) *Logger {
return &Logger{Logger: l.Logger.With("request_id", requestID)}
}
// Fatal logs a fatal error and exits the program
func (l *Logger) Fatal(msg string, args ...interface{}) {
l.Error(msg, args...)
os.Exit(1)
}