sinatra で、 config.ru を書いて rackup で動作させている場合、アクセスログとアプリログが混じってしまいます。
Rackの吐き出す アクセスログは access.log、自分のアプリログは app.log に出せるようにする方法。
アプリログ用のクラスを作る
app_logger.rb
class AppLog
def initialize(app, logger)
@app, @logger = app, logger
end
def call(env)
env["app.logger"] = @logger
@app.call(env)
end
end
config.ru にて、二つのロガーを指定する
config.ru
require 'logger'
require_relative './app_logger'
require_relative './app'
logdir = File.dirname(__FILE__) + "/log"
access_logger = ::Logger.new(logdir + '/access.log')
app_logger = ::Logger.new(logdir + '/app.log')
def access_logger.write(msg); self << msg; end
use Rack::CommonLogger, access_logger # アクセスログ
use AppLog, app_logger # アプリログ
run MyApp::Application
sinatraメインアプリで、自作のロガーを使えるようにする
app.rb
require "sinatra"
Module MyApp
def logger; env['app.logger'] || env['rack.logger']; end
get '/' do
logger.info "HELLO!"
erb :index
end
end
できました
これで / にアクセスすると、 app.log に "HELLO!"と記載されます。