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