Documentation
¶
Index ¶
- Variables
- func Close()
- func Debug(msg string, args ...any)
- func DebugS(message string, fields ...map[string]interface{})
- func Error(msg string, args ...any)
- func ErrorS(message string, fields ...map[string]interface{})
- func FatalS(message string, fields ...map[string]interface{})
- func ForSession(sessionID string) *slog.Logger
- func GetActiveSessionLogPaths() map[string]string
- func GetConfigDir() (string, error)
- func GetGlobalLogPath() string
- func GetLogDir(cfg *LogConfig) (string, error)
- func GetLogFilePath(cfg *LogConfig) (string, error)
- func GetSessionLogFilePath(cfg *LogConfig, sessionID string) (string, error)
- func GetTestLogDir() (string, error)
- func Info(msg string, args ...any)
- func InfoS(message string, fields ...map[string]interface{})
- func Initialize(daemon bool)
- func InitializeForTests(fileLevel LogLevel, consoleLevel LogLevel)
- func InitializeWithConfig(daemon bool, externalConfig interface{})
- func IsDebugEnabled() bool
- func LogForSession(sessionID, level, format string, v ...interface{})
- func LogSessionPathsToStderr()
- func SetRuntimeLevel(level LogLevel)
- func Warn(msg string, args ...any)
- func WarningS(message string, fields ...map[string]interface{})
- type AsyncHandler
- func (h *AsyncHandler) Dropped() int64
- func (h *AsyncHandler) Enabled(ctx context.Context, level slog.Level) bool
- func (h *AsyncHandler) Flush(_ context.Context) error
- func (h *AsyncHandler) Handle(ctx context.Context, r slog.Record) error
- func (h *AsyncHandler) StartDrain()
- func (h *AsyncHandler) WithAttrs(attrs []slog.Attr) slog.Handler
- func (h *AsyncHandler) WithGroup(name string) slog.Handler
- type Every
- type LogConfig
- type LogLevel
- type LogManager
- type SessionLogger
- type SessionLoggers
- type StructuredLogEntry
- type StructuredLogger
- func (sl *StructuredLogger) Debug(message string, fields ...map[string]interface{})
- func (sl *StructuredLogger) Error(message string, fields ...map[string]interface{})
- func (sl *StructuredLogger) Fatal(message string, fields ...map[string]interface{})
- func (sl *StructuredLogger) Info(message string, fields ...map[string]interface{})
- func (sl *StructuredLogger) Log(level LogLevel, message string, fields map[string]interface{})
- func (sl *StructuredLogger) LogWithFields(level LogLevel, message string, fields map[string]interface{})
- func (sl *StructuredLogger) Warning(message string, fields ...map[string]interface{})
- type TraceIDHandler
Constants ¶
This section is empty.
Variables ¶
var ( WarningLog *log.Logger InfoLog *log.Logger ErrorLog *log.Logger DebugLog *log.Logger )
Shim loggers for zero-migration compatibility — populated by LogManager.
var ( // ErrSessionLogsDisabled is returned when session logs are disabled in config ErrSessionLogsDisabled = fmt.Errorf("session logs disabled in config") )
Functions ¶
func Debug ¶ added in v1.35.0
Debug logs a debug-level message through the default slog handler. The handler drops debug records when the runtime level is above DEBUG, so this is safe to call without an IsDebugEnabled() guard.
func ForSession ¶ added in v1.15.0
ForSession returns a *slog.Logger pre-populated with "session" = sessionID. All calls route through the async slog handler — no stdlib mutex serialization. Session-specific log files still receive the entry via LogForSession when needed.
func GetActiveSessionLogPaths ¶
GetActiveSessionLogPaths returns the paths to all active session log files
func GetConfigDir ¶
GetConfigDir returns the path to the application's configuration directory
func GetGlobalLogPath ¶
func GetGlobalLogPath() string
GetGlobalLogPath returns the path to the global log file
func GetLogFilePath ¶
GetLogFilePath returns the full path to the log file
func GetSessionLogFilePath ¶
GetSessionLogFilePath returns the full path to a session-specific log file
func GetTestLogDir ¶
GetTestLogDir returns the directory where test logs should be stored Test logs are isolated in a dedicated subdirectory for easy cleanup
func Info ¶ added in v1.35.0
Info logs an info-level message through the default slog handler (async, no mutex hold). args are alternating key-value pairs: log.Info("msg", "key", val, "key2", val2)
func Initialize ¶
func Initialize(daemon bool)
func InitializeForTests ¶
InitializeForTests sets up logging specifically for test environments with dual-stream configuration. This allows DEBUG logs to go to file while ERROR logs appear in console for immediate visibility.
Parameters:
- fileLevel: Minimum level for file logging (typically DEBUG to capture everything)
- consoleLevel: Minimum level for console logging (typically ERROR to avoid noise)
Example:
log.InitializeForTests(log.DEBUG, log.ERROR) // DEBUG→file, ERROR→console
func InitializeWithConfig ¶
func InitializeWithConfig(daemon bool, externalConfig interface{})
InitializeWithConfig sets up logging with the provided configuration.
func IsDebugEnabled ¶ added in v1.35.0
func IsDebugEnabled() bool
IsDebugEnabled returns true when the runtime level is DEBUG. Use this to gate expensive format-string construction before calling DebugLog.Printf.
func LogForSession ¶
func LogForSession(sessionID, level, format string, v ...interface{})
LogForSession logs a message to the session-specific log file
func LogSessionPathsToStderr ¶
func LogSessionPathsToStderr()
LogSessionPathsToStderr outputs session log file paths to stderr on exit
func SetRuntimeLevel ¶ added in v1.35.0
func SetRuntimeLevel(level LogLevel)
SetRuntimeLevel changes the minimum log level for all output streams immediately. Safe to call from any goroutine. Takes effect on the next log call.
Types ¶
type AsyncHandler ¶ added in v1.35.0
type AsyncHandler struct {
// contains filtered or unexported fields
}
AsyncHandler wraps a slog.Handler with a channel buffer. Log calls enqueue a cloned Record and return immediately; a background goroutine drains the channel. On full buffer the record is dropped and the drop counter increments. WithAttrs and WithGroup share the same underlying channel so a single goroutine drains all derived loggers.
func NewAsyncHandler ¶ added in v1.35.0
func NewAsyncHandler(next slog.Handler, bufSize int) *AsyncHandler
NewAsyncHandler wraps next with an async channel of bufSize capacity.
func (*AsyncHandler) Dropped ¶ added in v1.35.0
func (h *AsyncHandler) Dropped() int64
Dropped returns the number of records dropped due to a full buffer.
func (*AsyncHandler) Flush ¶ added in v1.35.0
func (h *AsyncHandler) Flush(_ context.Context) error
Flush closes the channel and waits for all enqueued records to be written. After Flush the handler must not be used.
func (*AsyncHandler) Handle ¶ added in v1.35.0
Handle enqueues the record for async writing. Drops and counts if buffer full. Safe to call concurrently with Flush — the RWMutex ensures close and send are mutually exclusive: Flush cannot close the channel while a send is in progress.
func (*AsyncHandler) StartDrain ¶ added in v1.35.0
func (h *AsyncHandler) StartDrain()
StartDrain launches the background drain goroutine. Must be called once before the handler is used. Call Flush to stop it and drain remaining work.
type Every ¶
type Every struct {
// contains filtered or unexported fields
}
Every is used to log at most once every timeout duration.
type LogConfig ¶
type LogConfig struct {
LogsEnabled bool
LogsDir string
LogMaxSize int
LogMaxFiles int
LogMaxAge int
LogCompress bool
UseSessionLogs bool
LogLevel LogLevel // Deprecated: Use FileLevel and ConsoleLevel instead
StructuredLogs bool
PrettyLogs bool // For development - formats JSON logs for readability
// Dual-stream logging configuration (file + console)
ConsoleEnabled bool // Enable/disable console output (default: true)
ConsoleLevel LogLevel // Minimum level for console (default: ERROR for tests, INFO for production)
FileEnabled bool // Enable/disable file output (default: true)
FileLevel LogLevel // Minimum level for file (default: DEBUG)
}
LogConfig holds logging configuration
func ConfigToLogConfig ¶
func ConfigToLogConfig(externalConfig interface{}) *LogConfig
ConfigToLogConfig converts an external config to our internal LogConfig
func DefaultLogConfig ¶
func DefaultLogConfig() *LogConfig
DefaultLogConfig returns the default logging configuration
type LogLevel ¶
type LogLevel int
LogLevel represents the severity of a log entry
func GetRuntimeLevel ¶ added in v1.35.0
func GetRuntimeLevel() LogLevel
GetRuntimeLevel returns the current minimum log level.
func ParseLogLevel ¶
ParseLogLevel parses a string into a LogLevel
type LogManager ¶ added in v1.35.0
type LogManager struct {
// contains filtered or unexported fields
}
LogManager encapsulates all log state that was previously in package-level globals. Use NewLogManager to create one; use the package-level functions (InfoLog, etc.) via the defaultManager for zero-migration compatibility.
func (*LogManager) Close ¶ added in v1.35.0
func (m *LogManager) Close()
Close drains async writers, flushes the slog handler, and closes all log files. Drain order matters: async writers must be drained before the underlying file is closed, otherwise buffered entries are lost.
func (*LogManager) CloseSession ¶ added in v1.35.0
func (m *LogManager) CloseSession(id string)
CloseSession removes session-scoped loggers and closes their file handle.
func (*LogManager) ForSession ¶ added in v1.35.0
func (m *LogManager) ForSession(id string) (*SessionLoggers, error)
ForSession returns or creates session-scoped loggers.
type SessionLogger ¶ added in v1.15.0
type SessionLogger struct {
// contains filtered or unexported fields
}
SessionLogger is a session-scoped logger that automatically injects the session ID into every log call, eliminating the need to pass the session ID manually.
Usage:
logger := log.ForSession(i.Title)
logger.Error("Failed to setup git worktree: %v", err)
func ForSessionLegacy
deprecated
added in
v1.35.0
func ForSessionLegacy(sessionID string) *SessionLogger
ForSessionLegacy returns the old SessionLogger for callers that write to per-session log files. New code should use ForSession instead.
Deprecated: use ForSession.
func (*SessionLogger) Debug ¶ added in v1.15.0
func (sl *SessionLogger) Debug(format string, v ...interface{})
func (*SessionLogger) Error ¶ added in v1.15.0
func (sl *SessionLogger) Error(format string, v ...interface{})
func (*SessionLogger) Info ¶ added in v1.15.0
func (sl *SessionLogger) Info(format string, v ...interface{})
func (*SessionLogger) Warning ¶ added in v1.15.0
func (sl *SessionLogger) Warning(format string, v ...interface{})
type SessionLoggers ¶
type SessionLoggers struct {
WarningLog *log.Logger
InfoLog *log.Logger
ErrorLog *log.Logger
DebugLog *log.Logger
LogFile io.Closer
}
SessionLoggers holds the loggers for a specific session
func GetSessionLoggers ¶
func GetSessionLoggers(sessionID string) (*SessionLoggers, error)
GetSessionLoggers creates or retrieves loggers for a specific session
type StructuredLogEntry ¶
type StructuredLogEntry struct {
Timestamp time.Time `json:"timestamp"`
Level string `json:"level"`
Message string `json:"message"`
SessionID string `json:"session_id,omitempty"`
Component string `json:"component,omitempty"`
Function string `json:"function,omitempty"`
File string `json:"file,omitempty"`
Line int `json:"line,omitempty"`
Fields map[string]interface{} `json:"fields,omitempty"`
Error string `json:"error,omitempty"`
}
StructuredLogEntry represents a structured log entry
type StructuredLogger ¶
type StructuredLogger struct {
// contains filtered or unexported fields
}
StructuredLogger provides structured logging functionality
func NewStructuredLogger ¶
func NewStructuredLogger(writer io.Writer, level LogLevel, prettyLog bool) *StructuredLogger
NewStructuredLogger creates a new structured logger
func (*StructuredLogger) Debug ¶
func (sl *StructuredLogger) Debug(message string, fields ...map[string]interface{})
Debug logs a debug message
func (*StructuredLogger) Error ¶
func (sl *StructuredLogger) Error(message string, fields ...map[string]interface{})
Error logs an error message
func (*StructuredLogger) Fatal ¶
func (sl *StructuredLogger) Fatal(message string, fields ...map[string]interface{})
Fatal logs a fatal message
func (*StructuredLogger) Info ¶
func (sl *StructuredLogger) Info(message string, fields ...map[string]interface{})
Info logs an info message
func (*StructuredLogger) Log ¶
func (sl *StructuredLogger) Log(level LogLevel, message string, fields map[string]interface{})
Log writes a structured log entry
func (*StructuredLogger) LogWithFields ¶
func (sl *StructuredLogger) LogWithFields(level LogLevel, message string, fields map[string]interface{})
LogWithFields logs a message with additional fields
func (*StructuredLogger) Warning ¶
func (sl *StructuredLogger) Warning(message string, fields ...map[string]interface{})
Warning logs a warning message
type TraceIDHandler ¶ added in v1.35.0
type TraceIDHandler struct {
// contains filtered or unexported fields
}
TraceIDHandler is a slog.Handler middleware that injects OTel trace_id and span_id into every log record when a span is active in the context. It must be the outermost handler in the chain so trace IDs are extracted at call time, before the record enters the async buffer.
func NewTraceIDHandler ¶ added in v1.35.0
func NewTraceIDHandler(next slog.Handler) *TraceIDHandler
NewTraceIDHandler wraps next, injecting trace context into every Handle call.