Logger
Added in v1.8 · Updated March 13, 2026 · Modules
ruby stdlib logging debugging
The Logger class provides a flexible logging utility for Ruby applications. It allows you to record messages at different severity levels and direct output to various destinations like files, standard output, or custom IO objects.
Overview
Logger is built into Ruby’s standard library and offers:
- Severity levels: DEBUG, INFO, WARN, ERROR, FATAL
- Multiple outputs: Files, STDOUT, STDERR, or any IO object
- Log rotation: Automatic rotation by size or time
- Formatting: Customizable log message formats
Creating a Logger
require 'logger'
# Log to a file
logger = Logger.new('application.log')
# Log to standard output
logger = Logger.new(STDOUT)
# Log to standard error (default)
logger = Logger.new(STDERR)
# Log to a custom IO object
logger = Logger.new(File.open('app.log', 'a'))
Logger.new Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
logdev | String or IO | Required | File path or IO object |
shift_age | Integer | 0 | Number of old log files to keep |
shift_size | Integer | 1048576 | Max size before rotation (bytes) |
level | Integer | DEBUG | Minimum log level |
Logging Severity Levels
Logger defines five severity levels:
require 'logger'
logger = Logger.new(STDOUT)
logger.debug("Debug message - detailed diagnostic info")
logger.info("Info message - general operational events")
logger.warn("Warning message - something might be wrong")
logger.error("Error message - something failed")
logger.fatal("Fatal message - critical failure")
Level Methods
| Method | Level | Description |
|---|---|---|
debug | 0 | Detailed diagnostic information |
info | 1 | General informational messages |
warn | 2 | Warning messages |
error | 3 | Error messages |
fatal | 4 | Fatal/critical messages |
You can also use the numeric level directly:
logger.level = Logger::DEBUG # 0
logger.level = Logger::INFO # 1
logger.level = Logger::WARN # 2
logger.level = Logger::ERROR # 3
logger.level = Logger::FATAL # 4
To disable logging entirely:
logger.level = Logger::UNKNOWN # or any value > FATAL
Setting the Log Level
Control which messages get logged:
logger = Logger.new(STDOUT)
# Only log warnings and errors
logger.level = Logger::WARN
logger.debug("This won't show") # Skipped
logger.info("This won't show") # Skipped
logger.warn("Warning shown") # => "W -- : Warning shown"
logger.error("Error shown") # => "E -- : Error shown"
Log Formatting
Customize how log messages appear:
logger = Logger.new(STDOUT)
# Default format
# "D, [.ms] # -- : message"
# Custom format
logger.formatter = proc do |severity, datetime, progname, msg|
"[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}] #{severity.ljust(5)} - #{msg}\n"
end
logger.info("Application started")
# => [2026-03-13 12:00:00] INFO - Application started
Formatter Parameters
| Parameter | Description |
|---|---|
severity | Level name (DEBUG, INFO, etc.) |
datetime | Time object of the log entry |
progname | Program name (from progname= method) |
msg | The actual message |
Log Rotation
Automatically rotate logs to prevent disk space issues:
# Rotate when file exceeds 1MB, keep 5 old files
logger = Logger.new('app.log', 5, 1048576)
# Rotate daily, keep 7 days of logs
logger = Logger.new('app.log', 7)
Rotation Parameters
| Parameter | Description |
|---|---|
shift_age | Number of old files to keep, or frequency (daily, weekly) |
shift_size | Maximum size in bytes before rotation |
# Weekly rotation
logger = Logger.new('weekly.log', 'weekly')
# Size-based rotation (10MB max)
logger = Logger.new('large.log', 3, 10 * 1024 * 1024)
Practical Examples
Application Logging
require 'logger'
class Application
def initialize
@logger = Logger.new('app.log')
@logger.level = Logger::INFO
@logger.progname = 'MyApp'
end
def run
@logger.info("Application starting")
# ... application code ...
@logger.info("Application finished")
rescue => e
@logger.error("Application failed: #{e.message}")
end
end
Multiple Loggers
require 'logger'
# Debug log - detailed
debug_log = Logger.new('debug.log')
debug_log.level = Logger::DEBUG
# Production log - warnings and above
prod_log = Logger.new('production.log')
prod_log.level = Logger::WARN
Rails-Like Logging
require 'logger'
class CustomLogger < Logger
def format_message(level, datetime, progname, msg)
"#{level} [#{datetime}]: #{msg}\n"
end
end
logger = CustomLogger.new('custom.log')
logger.info("Custom format message")
Logging with Block Syntax
logger = Logger.new(STDOUT)
# Only evaluates block if level is enabled
logger.debug { "Expensive debug: #{expensive_computation}" }
logger.info { "User #{current_user.id} logged in" }
Logger Constants
| Constant | Value | Description |
|---|---|---|
DEBUG | 0 | Debug level |
INFO | 1 | Info level |
WARN | 2 | Warning level |
ERROR | 3 | Error level |
FATAL | 4 | Fatal level |
UNKNOWN | 5 | Unknown/severe level |
Ruby Version History
- Ruby 1.8: Introduced the Logger class
- Ruby 2.1: Improved thread safety
- Ruby 2.5: Added support for log rotation by time period