Lograge

Railsのデフォルトログの冗長性を改善する人気gem。複数のログエントリを1行にまとめ、クリーンで機械読み取り可能な出力を生成。本番環境でのノイズ削減と構造化ログに最適。歴代の偉大なRails gemの一つ。

ロギングRubyRails構造化ログリクエストログ

ロギングライブラリ

Lograge

概要

LogrageはRailsのデフォルトログの冗長性を改善する人気gemです。複数のログエントリを1行にまとめ、クリーンで機械読み取り可能な出力を生成します。本番環境でのノイズ削減と構造化ログに最適で、歴代の偉大なRails gemの一つとして認識されています。

詳細

LogrageはRailsアプリケーションのリクエストログを改善するために作られた特化型ライブラリです。Railsのデフォルトロガーは各リクエストで複数行のログを出力しますが、Logrageは重要な情報を1行に集約し、構造化された形式で提供します。

主要機能

  • 1行ログ: 複数のログエントリを単一行に集約
  • 構造化フォーマット: JSON、Logstash、LTSV等の豊富な出力形式
  • カスタムペイロード: リクエスト固有のデータ追加機能
  • フィルタリング: 特定のアクションやカスタム条件でのログ除外
  • パフォーマンス情報: レスポンス時間、DBクエリ時間等の自動収集

メリット・デメリット

メリット

  • ログノイズ削減: 本番環境でのログファイルサイズ大幅削減
  • 構造化ログ: JSON等の機械読み取り可能な形式での出力
  • 設定の簡単さ: 最小限の設定でRailsアプリケーションに統合可能
  • 豊富なフォーマッター: 8種類の組み込みフォーマッターで様々な用途に対応
  • カスタマイズ性: フレキシブルなペイロード拡張とフィルタリング機能
  • パフォーマンス監視: リクエスト毎のタイミング情報自動収集

デメリット

  • Rails特化: Railsリクエストログに限定、汎用ロギングには不適切
  • 情報制限: デフォルト状態では詳細なスタックトレース等は含まれない
  • 学習コスト: カスタムフォーマッターの実装には若干の理解が必要

参考ページ

書き方の例

基本的な設定

# Gemfileに追加
gem "lograge"

# config/initializers/lograge.rb または config/environments/production.rb
Rails.application.configure do
  config.lograge.enabled = true
end

フォーマッターの設定

Rails.application.configure do
  config.lograge.enabled = true
  
  # JSON形式での出力
  config.lograge.formatter = Lograge::Formatters::Json.new
  
  # Logstash形式での出力
  config.lograge.formatter = Lograge::Formatters::Logstash.new
  
  # カスタムフォーマッター
  config.lograge.formatter = ->(data) { "Called #{data[:controller]}##{data[:action]}" }
end

カスタムペイロードの追加

Rails.application.configure do
  config.lograge.enabled = true

  # コントローラーから追加情報を抽出
  config.lograge.custom_payload do |controller|
    {
      host: controller.request.host,
      user_id: controller.current_user.try(:id),
      ip: controller.request.remote_ip
    }
  end
end

カスタムオプションの設定

Rails.application.configure do
  config.lograge.enabled = true
  
  config.lograge.custom_options = lambda do |event|
    # リクエストパラメーターの除外設定
    exceptions = %w(controller action format id)
    {
      params: event.payload[:params].except(*exceptions),
      time: Time.now,
      host: event.payload[:host]
    }
  end
end

ログの除外設定

Rails.application.configure do
  config.lograge.enabled = true

  # 特定のアクションを除外
  config.lograge.ignore_actions = ['HomeController#index', 'HealthController#check']
  
  # カスタム条件での除外
  config.lograge.ignore_custom = lambda do |event|
    # ヘルスチェックや静的リソースの除外
    event.payload[:path] =~ /health_check/ || event.payload[:path] =~ /assets/
  end
end

ApplicationControllerでの拡張

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

例外情報の追加

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

カスタムログファイル設定

Rails.application.configure do
  config.lograge.enabled = true
  
  # 元のRailsログを保持
  config.lograge.keep_original_rails_log = true
  
  # 専用ログファイルに出力
  config.lograge.logger = ActiveSupport::Logger.new "#{Rails.root}/log/lograge_#{Rails.env}.log"
end

API専用アプリケーションでの設定

Rails.application.configure do
  config.lograge.enabled = true
  config.lograge.base_controller_class = 'ActionController::API'
  
  # 複数のベースクラスに対応
  config.lograge.base_controller_class = ['ActionController::API', 'ActionController::Base']
end