Documentation
¶
Overview ¶
Package logger provides structured logging for Go applications with support for multiple output formats and file rotation.
The package wraps the standard library log/slog with additional features:
- Multiple output destinations (stdout, file)
- Multiple formats (text, JSON)
- Configurable log levels
- Automatic file rotation using lumberjack
- Automatic stack trace capture for errors
- Safe resource management via CloseableLogger
Example:
cfg := logger.Config{
LogOutput: "file",
Path: "/var/log/app.log",
LogType: "json",
Level: "info",
MaxSize: 100, // MB
MaxBackups: 5,
MaxAge: 30, // days
}
log, err := logger.InitLogger(cfg)
if err != nil {
panic(err)
}
defer log.Close()
log.Info("Application started")
log.Error("Something went wrong", "err", errors.New("connection timeout"))
Index ¶
- type CloseableLogger
- func (c *CloseableLogger) Close() error
- func (c *CloseableLogger) Console(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) Debug(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) Error(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) ErrorStack(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) Info(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) Warn(msg string, keysAndValues ...interface{})
- func (c *CloseableLogger) WarnStack(msg string, keysAndValues ...interface{})
- type Config
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CloseableLogger ¶
CloseableLogger wraps slog.Logger with resource management capabilities. It handles optional closer (e.g., file-rotation writer) that may hold OS resources.
IMPORTANT: Callers MUST call Close() when the logger is no longer needed:
defer log.Close()
This ensures buffers are flushed and file handles are released. Failure to close may result in lost logs.
All logging methods safely handle nil loggers.
Example (StackTraces) ¶
ExampleCloseableLogger_stackTraces demonstrates automatic stack trace capture.
cfg := Config{
LogOutput: "stdout",
LogType: "text",
Level: "warn",
}
log, err := InitLogger(cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer log.Close()
// Auto stack trace when "error" or "err" key is present
log.Warn("validation failed", "err", errors.New("invalid email format"))
// Explicit stack trace regardless of keys
log.ErrorStack("critical operation failed", "operation", "database_migration")
Example (StructuredData) ¶
ExampleCloseableLogger_structuredData demonstrates structured key-value logging.
cfg := Config{
LogOutput: "stdout",
LogType: "text",
Level: "info",
}
log, err := InitLogger(cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer log.Close()
// Include relevant context in logs
log.Info("user action",
"user_id", 42,
"action", "login",
"ip_address", "192.168.1.100",
"success", true,
"duration_ms", 234,
)
func InitLogger ¶
func InitLogger(logConfig Config) (*CloseableLogger, error)
InitLogger creates and returns a new CloseableLogger based on the provided Config.
Parameters:
- logConfig: Configuration struct specifying logger output, format, and level
Returns:
- *CloseableLogger: Initialized logger (must call Close() when done)
- error: Any error during initialization (invalid config, file I/O failures, etc.)
Example:
cfg := logger.Config{
LogOutput: "file",
Path: "/var/log/app.log",
LogType: "json",
Level: "info",
MaxSize: 100,
MaxBackups: 5,
MaxAge: 30,
}
log, err := logger.InitLogger(cfg)
if err != nil {
panic(err)
}
defer log.Close()
Example (JsonOutput) ¶
ExampleInitLogger_jsonOutput demonstrates JSON formatted logging.
cfg := Config{
LogOutput: "stdout",
LogType: "json", // Switch to JSON format
Level: "debug",
}
log, err := InitLogger(cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer log.Close()
log.Info("request processed", "status", 200, "duration_ms", 145)
// Output shows JSON structured logging format with time, level, message, and key-value pairs
Example (Stdout) ¶
ExampleInitLogger_stdout demonstrates basic logging to stdout.
cfg := Config{
LogOutput: "stdout",
LogType: "text",
Level: "info",
}
log, err := InitLogger(cfg)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer log.Close()
log.Info("Application started", "version", "1.0.0")
log.Debug("Debug messages not shown at info level")
log.Warn("Warning: cache miss", "cache_key", "user:123")
log.Error("Error occurred", "err", errors.New("connection timeout"))
// Output shows structured logging format
func (*CloseableLogger) Close ¶
func (c *CloseableLogger) Close() error
Close flushes any pending log entries and releases underlying resources. Returns any error from closing the underlying io.Closer (e.g., file writer). Must be called before application shutdown to ensure all logs are written. Safe to call on nil logger.
func (*CloseableLogger) Console ¶
func (c *CloseableLogger) Console(msg string, keysAndValues ...interface{})
Console outputs a message directly to stderr (used for configuration warnings). Bypasses the normal slog handler chain for immediate visibility. Safe to call on nil logger.
func (*CloseableLogger) Debug ¶
func (c *CloseableLogger) Debug(msg string, keysAndValues ...interface{})
Debug logs a debug level message with optional key-value pairs. Safe to call on nil logger.
func (*CloseableLogger) Error ¶
func (c *CloseableLogger) Error(msg string, keysAndValues ...interface{})
Error logs an error level message with optional key-value pairs. Automatically includes stack trace if "error", "err", or "panic" keys are found. Safe to call on nil logger.
func (*CloseableLogger) ErrorStack ¶
func (c *CloseableLogger) ErrorStack(msg string, keysAndValues ...interface{})
ErrorStack logs an error level message with explicit stack trace appended. Always includes full runtime stack regardless of provided keys. Safe to call on nil logger.
func (*CloseableLogger) Info ¶
func (c *CloseableLogger) Info(msg string, keysAndValues ...interface{})
Info logs an info level message with optional key-value pairs. Safe to call on nil logger.
func (*CloseableLogger) Warn ¶
func (c *CloseableLogger) Warn(msg string, keysAndValues ...interface{})
Warn logs a warn level message with optional key-value pairs. Automatically includes stack trace if "error", "err", or "panic" keys are found. Safe to call on nil logger.
func (*CloseableLogger) WarnStack ¶
func (c *CloseableLogger) WarnStack(msg string, keysAndValues ...interface{})
WarnStack logs a warn level message with explicit stack trace appended. Always includes full runtime stack regardless of provided keys. Safe to call on nil logger.
type Config ¶
type Config struct {
Level string `mapstructure:"level"`
Path string `mapstructure:"path"`
MaxSize int `mapstructure:"max_size"`
MaxBackups int `mapstructure:"max_backups"`
MaxAge int `mapstructure:"max_age"`
Compress bool `mapstructure:"compress"`
LogType string `mapstructure:"log_type"`
LogOutput string `mapstructure:"log_output"`
}
Config holds the configuration for logger initialization.
Fields:
- LogType: Format of log output ("json" or "text")
- LogOutput: Output destination ("stdout" or "file")
- Level: Minimum log level ("debug", "info", "warn", "error")
- Path: Absolute path to log file (required for file output, ignored for stdout)
- MaxSize: Maximum size of log file in MB before rotation
- MaxBackups: Number of backup files to keep during rotation
- MaxAge: Maximum age of backup files in days
- Compress: Whether to gzip compress rotated backup files
Example ¶
ExampleConfig demonstrates file output configuration.
// This example shows how to configure file output
// Note: This doesn't actually run, just shows the structure
_ = Config{
LogType: "json",
LogOutput: "file",
Level: "info",
Path: "/var/log/myapp/app.log", // absolute path required
MaxSize: 100, // MB before rotation
MaxBackups: 5, // keep 5 backup files
MaxAge: 30, // days before deletion
Compress: true, // gzip compress backups
}