Rails あるいは Sinatra など向けの rack middleware gem を作りました。Web アプリケーションへのアクセスを curl コマンドとしてログに残すという機能です。

なんで作ったのか

作った人が退職している&ドキュメントがない&開発環境の構築が難しいが元気に稼働しているアプリケーションを改修しなければならない時、日々運用している中で特定のリクエストの時だけエラーになるが再現方法が掴めない時、などにあると便利だなと思って作りました。それぞれ本質的な解決方法ではないですが、あると地味に便利です。

どうやって使うのか

使い方は簡単です。Gemfile に追加します。

gem 'recurl'

あとは、それぞれのアプリケーション内で初期化処理をします。 Logger フォーマットのオブジェクトを渡してあげれば OK です。標準出力や物理ファイルなど適宜指定してください。

Sinatra

require 'rack'
require 'recurl'
require 'logger'

Recurl.configure do |config|
  config.logger = Logger.new(STDOUT)
end
use Recurl::Rack::Middleware

require File.expand_path 'app', File.dirname(__FILE__)
run MyApp

Ruby on Rails

Recurl.configure do |config|
  config.logger = Logger.new(STDOUT)
end

出力はこんな感じになります。

I, [2020-03-12T23:12:35.416211 #30019]  INFO -- : curl -X GET  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'  -H 'Cookie: key=value'  'http://localhost:3000/'

対応している Header など

全てのリクエストヘッダは出力していません。現時点で対応しているものは以下の通り。

  • User-Agent
  • Accept
  • Content-Type
  • Cookie

Authorize などカスタムヘッダは今後対応をしていきたいところです。また、ファイルのアップロードにも対応はしていません。POST / PUT などのパラメータには対応をしています。

その他