4

以下で説明する /health/api エンドポイントを持つ Sintra アプリがあり、ロード バランサーによって 1 秒間に何度も呼び出されます。このルートのみのデフォルトのロギングを削除するか、逆に、関心のあるエンドポイントのみをログに出力したいと考えています。

get '/health/api' do
  # Health Check
  'I keep quiet'
end

get '/members' do
  # get members data
  'This request gets logged'
end
4

1 に答える 1

7

デフォルトの Rack::CommonLogger を構成して、一部のリクエストのみを出力し、他のリクエストを表示しないようにすることはできません。ただし、デフォルトの CommonLogger を無効にして、代わりに独自のフィルタリング機能を使用できます。

require 'rubygems'
require 'rack'
require 'sinatra'

LOGGING_BLACKLIST = ['/health/api']

class FilteredCommonLogger < Rack::CommonLogger
  def call(env)
    if filter_log(env)
      # default CommonLogger behaviour: log and move on
      super
    else
      # pass request to next component without logging
      @app.call(env)
    end
  end

  # return true if request should be logged
  def filter_log(env)
    !LOGGING_BLACKLIST.include?(env['PATH_INFO'])
  end
end

disable :logging
use FilteredCommonLogger

get '/members' do
  # get members data
  'This request gets logged'
end

get '/health/api' do
  # Health Check
  'I keep quiet'
end

もちろん、「ホワイトリストに登録された」リクエストのみをログに記録するカスタム ロガーを作成することもできます。

于 2012-11-21T21:54:42.347 に答える