2026-03-06 12:50:09 +00:00
|
|
|
package exec
|
|
|
|
|
|
2026-04-04 07:15:04 +00:00
|
|
|
import "sync"
|
|
|
|
|
|
2026-03-06 12:50:09 +00:00
|
|
|
// Logger interface for command execution logging.
|
|
|
|
|
// Compatible with pkg/log.Logger and other structured loggers.
|
|
|
|
|
type Logger interface {
|
|
|
|
|
// Debug logs a debug-level message with optional key-value pairs.
|
2026-04-04 00:39:27 +00:00
|
|
|
//
|
|
|
|
|
// Example:
|
|
|
|
|
// logger.Debug("starting", "cmd", "go")
|
2026-03-06 12:50:09 +00:00
|
|
|
Debug(msg string, keyvals ...any)
|
|
|
|
|
// Error logs an error-level message with optional key-value pairs.
|
2026-04-04 00:39:27 +00:00
|
|
|
//
|
|
|
|
|
// Example:
|
|
|
|
|
// logger.Error("failed", "cmd", "go", "err", err)
|
2026-03-06 12:50:09 +00:00
|
|
|
Error(msg string, keyvals ...any)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// NopLogger is a no-op logger that discards all messages.
|
|
|
|
|
type NopLogger struct{}
|
|
|
|
|
|
|
|
|
|
// Debug discards the message (no-op implementation).
|
|
|
|
|
func (NopLogger) Debug(string, ...any) {}
|
|
|
|
|
|
|
|
|
|
// Error discards the message (no-op implementation).
|
|
|
|
|
func (NopLogger) Error(string, ...any) {}
|
|
|
|
|
|
2026-04-04 03:17:30 +00:00
|
|
|
var _ Logger = NopLogger{}
|
|
|
|
|
|
2026-04-04 07:15:04 +00:00
|
|
|
var (
|
|
|
|
|
defaultLoggerMu sync.RWMutex
|
|
|
|
|
defaultLogger Logger = NopLogger{}
|
|
|
|
|
)
|
2026-03-06 12:50:09 +00:00
|
|
|
|
|
|
|
|
// SetDefaultLogger sets the package-level default logger.
|
|
|
|
|
// Commands without an explicit logger will use this.
|
2026-04-04 00:39:27 +00:00
|
|
|
//
|
|
|
|
|
// Example:
|
|
|
|
|
//
|
|
|
|
|
// exec.SetDefaultLogger(logger)
|
2026-03-06 12:50:09 +00:00
|
|
|
func SetDefaultLogger(l Logger) {
|
2026-04-04 07:15:04 +00:00
|
|
|
defaultLoggerMu.Lock()
|
|
|
|
|
defer defaultLoggerMu.Unlock()
|
|
|
|
|
|
2026-03-06 12:50:09 +00:00
|
|
|
if l == nil {
|
|
|
|
|
l = NopLogger{}
|
|
|
|
|
}
|
|
|
|
|
defaultLogger = l
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// DefaultLogger returns the current default logger.
|
2026-04-04 00:39:27 +00:00
|
|
|
//
|
|
|
|
|
// Example:
|
|
|
|
|
//
|
|
|
|
|
// logger := exec.DefaultLogger()
|
2026-03-06 12:50:09 +00:00
|
|
|
func DefaultLogger() Logger {
|
2026-04-04 07:15:04 +00:00
|
|
|
defaultLoggerMu.RLock()
|
|
|
|
|
defer defaultLoggerMu.RUnlock()
|
|
|
|
|
|
2026-03-06 12:50:09 +00:00
|
|
|
return defaultLogger
|
|
|
|
|
}
|