Lograge
Popular gem improving verbosity of Rails default logging. Combines multiple log entries into single line, generating clean, machine-readable output. Optimal for noise reduction and structured logging in production environments. One of all-time great Rails gems.
Logging Library
Lograge
Overview
Lograge is a popular gem that improves the verbosity of Rails default logging. It combines multiple log entries into a single line, generating clean, machine-readable output. Optimal for noise reduction and structured logging in production environments, it's recognized as one of the all-time great Rails gems.
Details
Lograge is a specialized library created to improve Rails application request logging. While Rails' default logger outputs multiple lines of logs for each request, Lograge consolidates important information into a single line and provides it in a structured format.
Key Features
- Single-line Logging: Consolidates multiple log entries into a single line
- Structured Formats: Rich output formats including JSON, Logstash, LTSV, etc.
- Custom Payload: Ability to add request-specific data
- Filtering: Log exclusion for specific actions or custom conditions
- Performance Information: Automatic collection of response times, DB query times, etc.
Pros and Cons
Pros
- Log Noise Reduction: Significantly reduces log file sizes in production environments
- Structured Logging: Output in machine-readable formats like JSON
- Easy Configuration: Minimal setup required for Rails application integration
- Rich Formatters: 8 built-in formatters supporting various use cases
- Customizability: Flexible payload extension and filtering capabilities
- Performance Monitoring: Automatic collection of timing information per request
Cons
- Rails-specific: Limited to Rails request logging, inappropriate for general-purpose logging
- Information Limitation: Detailed stack traces not included by default
- Learning Curve: Implementing custom formatters requires some understanding
Reference Pages
Usage Examples
Basic Configuration
# Add to Gemfile
gem "lograge"
# config/initializers/lograge.rb or config/environments/production.rb
Rails.application.configure do
config.lograge.enabled = true
end
Formatter Configuration
Rails.application.configure do
config.lograge.enabled = true
# JSON format output
config.lograge.formatter = Lograge::Formatters::Json.new
# Logstash format output
config.lograge.formatter = Lograge::Formatters::Logstash.new
# Custom formatter
config.lograge.formatter = ->(data) { "Called #{data[:controller]}##{data[:action]}" }
end
Adding Custom Payload
Rails.application.configure do
config.lograge.enabled = true
# Extract additional information from controller
config.lograge.custom_payload do |controller|
{
host: controller.request.host,
user_id: controller.current_user.try(:id),
ip: controller.request.remote_ip
}
end
end
Custom Options Configuration
Rails.application.configure do
config.lograge.enabled = true
config.lograge.custom_options = lambda do |event|
# Request parameter exclusion settings
exceptions = %w(controller action format id)
{
params: event.payload[:params].except(*exceptions),
time: Time.now,
host: event.payload[:host]
}
end
end
Log Exclusion Settings
Rails.application.configure do
config.lograge.enabled = true
# Exclude specific actions
config.lograge.ignore_actions = ['HomeController#index', 'HealthController#check']
# Exclusion with custom conditions
config.lograge.ignore_custom = lambda do |event|
# Exclude health checks and static resources
event.payload[:path] =~ /health_check/ || event.payload[:path] =~ /assets/
end
end
ApplicationController Extension
class ApplicationController < ActionController::Base
def append_info_to_payload(payload)
super
payload[:host] = request.host
payload[:user_agent] = request.user_agent
payload[:referer] = request.referer
end
end
Adding Exception Information
Rails.application.configure do
config.lograge.enabled = true
config.lograge.custom_options = lambda do |event|
{
exception: event.payload[:exception], # ["ExceptionClass", "the message"]
exception_object: event.payload[:exception_object], # the exception instance
backtrace: event.payload[:exception_object]&.backtrace&.first(5)
}
end
end
Custom Log File Configuration
Rails.application.configure do
config.lograge.enabled = true
# Keep original Rails log
config.lograge.keep_original_rails_log = true
# Output to dedicated log file
config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/lograge_#{Rails.env}.log"
end
API-only Application Configuration
Rails.application.configure do
config.lograge.enabled = true
config.lograge.base_controller_class = 'ActionController::API'
# Support for multiple base classes
config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base']
end