package logger import ( "context" "sync" ) var ( globalLogger Logger globalMu sync.RWMutex ) // SetGlobalLogger sets the global logger instance. func SetGlobalLogger(l Logger) { globalMu.Lock() defer globalMu.Unlock() globalLogger = l } // GetGlobalLogger returns the global logger instance. // Returns a no-op logger if no global logger is set. func GetGlobalLogger() Logger { globalMu.RLock() defer globalMu.RUnlock() if globalLogger == nil { return &noOpLogger{} } return globalLogger } // Debug logs a message at debug level using the global logger. func Debug(msg string, fields ...Field) { GetGlobalLogger().Debug(msg, fields...) } // Info logs a message at info level using the global logger. func Info(msg string, fields ...Field) { GetGlobalLogger().Info(msg, fields...) } // Warn logs a message at warning level using the global logger. func Warn(msg string, fields ...Field) { GetGlobalLogger().Warn(msg, fields...) } // ErrorLog logs a message at error level using the global logger. func ErrorLog(msg string, fields ...Field) { GetGlobalLogger().Error(msg, fields...) } // noOpLogger is a logger that does nothing. // Used as a fallback when no global logger is set. type noOpLogger struct{} func (n *noOpLogger) Debug(msg string, fields ...Field) {} func (n *noOpLogger) Info(msg string, fields ...Field) {} func (n *noOpLogger) Warn(msg string, fields ...Field) {} func (n *noOpLogger) Error(msg string, fields ...Field) {} func (n *noOpLogger) With(fields ...Field) Logger { return n } func (n *noOpLogger) WithContext(ctx context.Context) Logger { return n }