重複の可能性:
SinatraでクライアントのIPアドレスを取得しますか?
私はApacheとPassengerでSinatraを使用しています。
私は現在、次のロガーを使用していますconfig.ru
:
LOGGER = Logger.new("logs/sinatra.log")
次を使用してアプリにログインできます。
LOGGER.error "Log msg"
ログエントリの例は次のようになります。
E, [2013-01-18T19:43:41.857146 #19412] ERROR -- : Log msg
現在のユーザーのIPをログに記録するにはどうすればよいですか?次のようになります。
E, [2013-01-18T19:43:41.857146 #19412] ERROR -- : <127.0.0.1> Log msg
私は書くことができます:
LOGGER.error "<#{request.ip}> Log msg"
しかし、私はすべてのログメッセージにそれを入れたいので、常に手動でIPを付加するのは間違った方法のようです。自動的LOGGER
に解析してログに記録するように構成するにはどうすればよいですか?request.ip
いくつかの回答で示唆されているように、私はそれを次のように試しました:
configure.ru:
configure do
LOGGER = Logger.new("logs/sinatra.log")
original_formatter = Logger::Formatter.new
LOGGER.formatter = proc { |severity, datetime, progname, msg|
original_formatter.call(severity, datetime, progname, "#{ip} #{msg.dump}")
}
end
app.rb:
helpers do
def ip
request.ip
end
end
get '/' do
LOGGER.info 'test'
end
結果は次のとおりです。
NameError: undefined local variable or method `ip' for #<Rack::Builder:0x00000001821c60>
更新TinManの回答に基づいて、次のヘルパーを思いつきました。
helpers do
def log(call,msg = '')
severity = Logger.const_get(call.upcase)
return if LOGGER.level > severity
msg = yield if block_given?
LOGGER.send(call, "<#{request.ip}> #{msg}")
end
end
だから私はこれを行うことができます:
log :info, 'msg'
log(:debug) { very.expensive.operation }
これは私が望んでいた解決策のように見えます。改善の余地はありますか?