2013-01-18 65 views
0

可能重複:
Get client’s IP address in Sinatra?我如何總是使用記錄器記錄IP?

我使用西納特拉與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 } 

這看起來像我想要的解決方案。有改進的餘地嗎?

+0

無法保證IP可用是有效的,因爲代理,NAT等 –

+0

可能重複的[簡單和理想的日誌在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) –

+0

@theTinMan但有些IP地址必須在那裏,因爲某些事件觸發了請求。應該被記錄。而在你鏈接的線程中,我看不到默認情況下輸出IP的方法。 – Markus

回答

1

請參閱 「Simple and Ideal Logging in Sinatra」:

我傾向於使用類似:

require 'sinatra' 
use Rack::Logger 

def log(msg) 
    logger.info('%s: %s' % [request.ip, msg]) 
end 

get '/' do 
    log("Request for '/'") 
    '<html><body>psych</body></html>' 
end 

,輸出:

 
I, [2013-01-18T23:39:42.049072 #81011] INFO -- : 127.0.0.1: Request for '/' 
127.0.0.1 - - [18/Jan/2013 23:39:42] "GET/HTTP/1.1" 200 31 0.0034 

我能子類的記錄儀,或修補它,但我更喜歡用本地方法包裝記錄器調用。我們在工作中使用這些應用程序,並且它很好地工作。

+0

這些日誌在哪裏去?除了常規輸出之外,這可以是一個單獨的日誌文件('logs/sinatra.log')嗎?我必須爲每個嚴重性定義一個方法('info error warn'等)或者讓方法接受兩個參數(嚴重性+ msg),所以'log(:info,'msg')'可以工作。 okey,是一個想法。 – Markus

+0

根據您對我的問題的回答添加了一個幫手。你有沒有看到有待改進的空間? – Markus