2015-02-24 12 views
8

HTTP üstbilgileri, gövdeleri vb. Dahil olmak üzere tüm istekleri belirli bir URL'ye kaydetmem gerekiyor. Bu kodu denedim:Belirli bir URL için tüm istek (başlık, gövde vb.) Nasıl kaydedilir?

def index 
    global_request_logging 
end 

private 

def global_request_logging 
    http_request_header_keys = request.headers.keys.select{|header_name| header_name.match("^HTTP.*")} 
    http_request_headers = request.headers.select{|header_name, header_value| http_request_header_keys.index(header_name)} 
    logger.info "Received #{request.method.inspect} to #{request.url.inspect} from #{request.remote_ip.inspect}. Processing with headers #{http_request_headers.inspect} and params #{params.inspect}" 
    begin 
     yield 
    ensure 
     logger.info "Responding with #{response.status.inspect} => #{response.body.inspect}" 
    end 
    end 

Ama request.headerskeys adında bir yöntem içermiyor söyledi. Ayrıca, bunu yapmak için daha kolay bir yol veya standart olması gerektiğini düşünüyorum. Tercihen, bir mücevher kullanmamak.

+0

Başlık yorumunun bir anahtar yöntemi yoktur. http://api.rubyonrails.org/classes/ActionDispatch/Http/Headers.html Değerleri içeren bir karma olan 'env' adlı bir örnek değişkeni var. Yani 'request.headers.env.keys' yapabilmeniz gerekir. Başlık sınıfının nasıl çalıştığını anlamak için kaynağı kontrol edin, oldukça küçük: https://github.com/rails/rails/blob/e7b0947afdc8c9f4119d06628070667b9e7875d1/actionpack/lib/action_dispatch/http/headers.rb – Brennan

cevap

11

request.headers bir hash döndürür, ancak aslında, keys yönteminin tanımlanmamış bir Http::Headers örneğini döndürür.

Ancak bir Http::Headers, özgün env sağlama değerini döndüren env yanıtını verir. Bu nedenle böyle bir şey işi olabilir:

http_request_header_keys = request.headers.env.keys.select do |header_name| 
    header_name.match("^HTTP.*") 
end 

Ya da tüm anahtar-değer-çiftleri üzerinde yineleme ve başka karma içine kopyalayabilirsiniz: Bu kadar tamamlamak için

http_envs = {}.tap do |envs| 
    request.headers.each do |key, value| 
    envs[key] = value if key.downcase.starts_with?('http') 
    end 
end 

logger.info <<-LOG.squish 
    Received  #{request.method.inspect} 
    to   #{request.url.inspect} 
    from   #{request.remote_ip.inspect}. 
    Processing 
    with headers #{http_envs.inspect} 
    and params #{params.inspect}" 
LOG 

:

around_action :log_everything, only: :index 

def index 
    # ... 
end 

private 
def log_everything 
    log_headers 
    yield 
ensure 
    log_response 
end 

def log_headers 
    http_envs = {}.tap do |envs| 
    request.headers.each do |key, value| 
     envs[key] = value if key.downcase.starts_with?('http') 
    end 
    end 

    logger.info "Received #{request.method.inspect} to #{request.url.inspect} from #{request.remote_ip.inspect}. Processing with headers #{http_envs.inspect} and params #{params.inspect}" 
end 

def log_response 
    logger.info "Responding with #{response.status.inspect} => #{response.body.inspect}" 
end 
+0

Eh, bu bir buçuk Çözümün Vücudu günlüğe kaydetmeye ne dersin? –

+0

@jawanam: Cevabımı 'around_action' – spickermann

+0

süper cool örneği ile güncelledim, teşekkürler! –

1

tam başlıkları almak için bu kullanıyorum:

request.headers.env.select do |k, _| 
    k.downcase.start_with?('http') || 
    k.in?(ActionDispatch::Http::Headers::CGI_VARIABLES) 
end 
İlgili konular