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.

loggingRubyRailsstructured-loggingrequest-logging

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