[Rails] Action Controller ログ購読者における内部パラメータ処理ロジックの重複排除
変更の背景
RailsのStructured Events機能の実装に伴い、Action Controllerのログ処理において内部パラメータ(controller、action、formatなど)を除外する処理が重複していることが判明しました。
従来、この処理はActionController::LogSubscriberに実装されていましたが、Structured Eventsの導入によりActionController::StructuredEventSubscriberにも同様の処理が追加されました。その結果、StructuredEventSubscriber#start_processingで既に内部キーが除外されたパラメータがLogSubscriber#request_startedに渡されるにもかかわらず、LogSubscriber側でも再度同じフィルタリング処理を行うという無駄が発生していました。
技術的な変更内容
変更前の実装
ActionController::LogSubscriberでは、以下のようにINTERNAL_PARAMS定数を定義し、request_startedメソッド内でパラメータから内部キーを除外する処理を実装していました。
module ActionController
class LogSubscriber < ActiveSupport::EventReporter::LogSubscriber
INTERNAL_PARAMS = %w(controller action format _method only_path)
def request_started(event)
payload = event[:payload]
params = {}
payload[:params].each_pair do |k, v|
params[k] = v unless INTERNAL_PARAMS.include?(k)
end
# ...
end
end
end
しかし、StructuredEventSubscriberが既にこの処理を担当しているため、request_startedメソッドが受け取る時点でpayload[:params]は既にフィルタリング済みのハッシュとなっています。
変更後の実装
重複したロジックを削除し、StructuredEventSubscriber#start_processingのみが内部キーの除外を担当するようシンプル化されました。
module ActionController
class LogSubscriber < ActiveSupport::EventReporter::LogSubscriber
def request_started(event)
payload = event[:payload]
params = payload[:params] # 既にフィルタリング済み
format = payload[:format]
# ...
end
end
end
INTERNAL_PARAMS定数の定義と、パラメータをループしてフィルタリングする6行のコードが削除され、単純な代入処理のみとなりました。
影響範囲
この変更は内部実装の最適化であり、外部から観察可能な動作に変更はありません。ログの出力内容も従来と同じです。ただし、以下の点で改善が見込まれます。
- パフォーマンス: 不要な繰り返し処理が削除され、わずかながらリクエスト処理のオーバーヘッドが減少
- 保守性: ロジックの重複が解消され、将来的な変更時の修正箇所が一箇所に集約される
-
可読性:
LogSubscriberの責務が明確化され、コードの意図が理解しやすくなる
まとめ
Structured Events機能の導入により生じた処理の重複を解消することで、Railsのログ処理がよりクリーンで効率的になりました。このようなリファクタリングは、機能追加時に既存コードとの整合性を保つために重要な取り組みです。