0

重複の可能性:
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 }

これは私が望んでいた解決策のように見えます。改善の余地はありますか?

4

2 に答える 2

1

「シナトラでのシンプルで理想的なロギング」を参照してください。

私は次のようなものを使用する傾向があります:

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

どの出力:

私、[2013-01-18T23:39:42.049072#81011]情報-:127.0.0.1:「/」のリクエスト
127.0.0.1 --- [18 / Jan / 2013 23:39:42] "GET / HTTP / 1.1" 200 31 0.0034

Loggerをサブクラス化するか、パッチを適用することもできますが、ロガー呼び出しをローカルメソッドでラップすることをお勧めします。職場のいくつかのアプリでそれを使用しており、うまく機能します。

于 2013-01-19T05:56:53.700 に答える
-1

Loggerのフォーマッタを上書きできます。例については、 http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.htmlを参照してください。sinatraヘルパーメソッドを作成してリクエストIPを返すことができるため、フォーマッタープロシージャから呼び出すことができます。

于 2013-01-18T19:25:55.273 に答える