我使用西納特拉與Apache和乘客。
我目前使用下面的記錄器在我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>
更新基於theTinMan的答案,我想出了下面的幫助:
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 }
這看起來像我想要的解決方案。有改進的餘地嗎?
無法保證IP可用是有效的,因爲代理,NAT等 –
可能重複的[簡單和理想的日誌在Sinatra](http://stackoverflow.com/questions/9644753/simple-and - Sinatra Logger for Web Service Errors](http://stackoverflow.com/q/8716595/128421),[在Sinatra中記錄](http://stackoverflow.com/q/ 5995854/128421)和[在Sinatra獲取客戶端的IP地址?](http://stackoverflow.com/questions/1319331/get-clients-ip-address-in-sinatra) –
@theTinMan但有些IP地址必須在那裏,因爲某些事件觸發了請求。應該被記錄。而在你鏈接的線程中,我看不到默認情況下輸出IP的方法。 – Markus