Documentation
¶
Overview ¶
Package logger provides logging facilities for the gitbak application.
This package implements a simple, structured logging system with different log levels, colors for terminal output, and the ability to write logs to both the console and a file simultaneously. It defines both the logging interface and the standard implementation used throughout the application.
Core Components ¶
- Logger: The main interface for logging used throughout the application
- DefaultLogger: Standard implementation that writes to console and/or file
Features ¶
- Multiple log levels (Info, Warning, Error, Success)
- Emoji-prefixed output for terminal visibility
- File logging with rotation
- User-facing vs. debug-only messages
- Conditional logging based on verbosity settings
Log Levels ¶
The logger supports the following distinct message types:
- Info: General information messages
- InfoToUser: Important information to display to the user
- Warning: Warning messages for potential issues
- WarningToUser: Important warnings to display to the user
- Error: Error messages for failures
- Success: Success messages for completed operations
- StatusMessage: Current status updates
Usage ¶
Basic usage pattern:
// Create a new logger logger := logger.New(true, "/path/to/log.file", true) // Log different types of messages logger.Info("Debug-only information: %v", details) logger.InfoToUser("Important information: %v", userInfo) logger.Warning("Potential issue: %v", warning) logger.Error("An error occurred: %v", err) logger.Success("Operation completed: %v", result)
Usage With Dependency Injection ¶
The Logger interface is typically injected into components that need logging capabilities:
type MyComponent struct { logger logger.Logger // other fields } func NewMyComponent(logger logger.Logger) *MyComponent { return &MyComponent{ logger: logger, } } func (c *MyComponent) DoSomething() error { // Internal logging (debug information) c.logger.Info("Starting operation") // User-facing information c.logger.InfoToUser("Processing your request") // Success message shown to the user c.logger.Success("Operation completed successfully") return nil }
Console Output ¶
Console output is formatted with emoji prefixes to distinguish different message types:
- Info: ℹ️ prefix (for InfoToUser messages)
- Warning: ⚠️ prefix (only shown when verbose, unless WarningToUser)
- Error: ❌ prefix
- Success: ✅ prefix
- Debug Log Enabled: 🔍 prefix
Messages directed specifically to users (InfoToUser, WarningToUser) are always displayed regardless of verbosity settings.
File Logging ¶
When a log file is specified, all messages (regardless of verbosity settings) are written to the file. File logging includes timestamps and does not include ANSI color codes.
Resource Management ¶
The Logger interface provides a Close method that should be called before application termination to ensure all buffered logs are flushed to disk:
defer logger.Close()
Thread Safety ¶
The DefaultLogger implementation is safe for concurrent use by multiple goroutines. All logging methods can be called from different goroutines without additional synchronization.
Index ¶
- type DefaultLogger
- func (l *DefaultLogger) Close() error
- func (l *DefaultLogger) Error(format string, args ...interface{})
- func (l *DefaultLogger) Info(format string, args ...interface{})
- func (l *DefaultLogger) InfoToUser(format string, args ...interface{})
- func (l *DefaultLogger) SetStderr(w io.Writer)
- func (l *DefaultLogger) SetStdout(w io.Writer)
- func (l *DefaultLogger) StatusMessage(format string, args ...interface{})
- func (l *DefaultLogger) Success(format string, args ...interface{})
- func (l *DefaultLogger) Warning(format string, args ...interface{})
- func (l *DefaultLogger) WarningToUser(format string, args ...interface{})
- type Logger
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DefaultLogger ¶
type DefaultLogger struct {
// contains filtered or unexported fields
}
DefaultLogger provides structured logging capability and implements the Logger interface
func NewWithOutput ¶
func NewWithOutput(enabled bool, logFile string, verbose bool, stdout, stderr io.Writer) *DefaultLogger
NewWithOutput creates a DefaultLogger with custom output writers
func (*DefaultLogger) Close ¶
func (l *DefaultLogger) Close() error
Close ensures any buffered data is written and closes open log file handles
func (*DefaultLogger) Error ¶
func (l *DefaultLogger) Error(format string, args ...interface{})
Error logs an error message
func (*DefaultLogger) Info ¶
func (l *DefaultLogger) Info(format string, args ...interface{})
Info logs an informational message (file only)
func (*DefaultLogger) InfoToUser ¶
func (l *DefaultLogger) InfoToUser(format string, args ...interface{})
InfoToUser logs an informational message to both file and stdout
func (*DefaultLogger) SetStderr ¶
func (l *DefaultLogger) SetStderr(w io.Writer)
SetStderr sets a custom writer for user-facing stderr messages only. NOTE: This does not affect where structured log messages from slog are directed. This method is thread-safe and is primarily intended for testing.
func (*DefaultLogger) SetStdout ¶
func (l *DefaultLogger) SetStdout(w io.Writer)
SetStdout sets a custom writer for user-facing stdout messages only. NOTE: This does not affect where structured log messages from slog are directed. This method is thread-safe and is primarily intended for testing.
func (*DefaultLogger) StatusMessage ¶
func (l *DefaultLogger) StatusMessage(format string, args ...interface{})
StatusMessage prints a status message to stdout only (no logging)
func (*DefaultLogger) Success ¶
func (l *DefaultLogger) Success(format string, args ...interface{})
Success logs a success message to both file and stdout
func (*DefaultLogger) Warning ¶
func (l *DefaultLogger) Warning(format string, args ...interface{})
Warning logs a warning message
func (*DefaultLogger) WarningToUser ¶
func (l *DefaultLogger) WarningToUser(format string, args ...interface{})
WarningToUser logs a warning message to both file and stdout
type Logger ¶
type Logger interface { // Info logs an informational message for debugging purposes. // These messages are typically only written to log files and are not shown to users // unless verbose mode is enabled. // // The format string follows fmt.Printf style formatting. Info(format string, args ...interface{}) // Warning logs a warning message for debugging purposes. // These messages indicate potential issues that are not critical failures. // They are typically only written to log files and are not shown to users // unless verbose mode is enabled. // // The format string follows fmt.Printf style formatting. Warning(format string, args ...interface{}) // Error logs an error message for debugging purposes. // These messages indicate operational failures or errors that occurred // during program execution. They are typically written to log files and // may also be shown to users depending on the logger implementation. // // The format string follows fmt.Printf style formatting. Error(format string, args ...interface{}) // InfoToUser logs an informational message intended for users. // These messages are always shown to users regardless of verbose settings, // and are also written to log files. // // The format string follows fmt.Printf style formatting. InfoToUser(format string, args ...interface{}) // WarningToUser logs a warning message intended for users. // These messages highlight important issues that users should be aware of, // and are always shown regardless of verbose settings. // // The format string follows fmt.Printf style formatting. WarningToUser(format string, args ...interface{}) // Success logs a success message to the user. // These messages indicate successful completion of operations and are // typically styled differently (e.g., green text) to stand out. // // The format string follows fmt.Printf style formatting. Success(format string, args ...interface{}) // StatusMessage logs a status message to the user. // These messages provide information about the current state of the application // and are always shown to users. They are typically used for displaying // configuration information, progress updates, and other operational status. // // The format string follows fmt.Printf style formatting. StatusMessage(format string, args ...interface{}) // Close ensures any buffered data is written and closes open log file handles. // This should be called before the application exits to ensure all logs are properly saved. Close() error }
Logger defines the common logging interface used throughout the application. It provides a standardized way to emit log messages at different levels of importance, with a clear separation between internal (debug) logs and user-facing messages.
The interface is designed to handle both internal logging needs (Info, Warning, Error) and user communication (InfoToUser, WarningToUser, Success, StatusMessage).