Railsは4.1.1で検証しました。
例えばRackミドルウェアの中でロギングしていて、そこにRailsの情報も含めたいという場合、callの引数であるenvからRailsのControllerのインスタンスを取得することができます。
Controllerのインスタンスはenv['action_controller.instance']
に格納されています。
これはairbrakeのユーザ連携などでも使用されています。
https://github.com/airbrake/airbrake/blob/baf02e0b3b112c34f31880d998344141729bc2ce/lib/airbrake/rack/user.rb#L25
Rackミドルウェアの場合、
def call(env)
status, headers, body = @app.call(env)
ensure
controller = env['action_controller.instance']
controller.class # => XXXController
end
とすることでインスタンスが取れるので、Railsがもつ様々な情報にアクセスできます。
# アクション名
env['action_controller.instance'].action_name => "show"
# ログに表示されるActiveRecordの実行時間(msec)
env['action_controller.instance'].db_runtime # => 30.77199999999999
# ログに表示されるViewの実行時間(msec)
env['action_controller.instance'].view_runtime # => 2.412
# params
env['action_controller.instance'].params
# request
env['action_controller.instance'].request
# 自前で定義したメソッドも呼べる
env['action_controller.instance'].current_user