2011-08-27 8 views
4

레일즈 애플리케이션 로그에서 전체 URL을 가져올 수 있습니까? 현재 내가 좋아하는 뭔가를 받고 있어요 :전체 URL을 레일스 로그

이 2011-08-27 13시 13분 10초 0200

에서 "/"127.0.0.1에 대한 GET 시작하지만 난 얻을 필요가 :

은 "HTTP를 : // localhost를 : 3000 /"GET 시작 2011-08-27 13시 13분 10초 0200

이 도메인이 중요한 응용 프로그램이기 때문에에서 127.0.0.1합니다.

답변

2

Rails 3.2.12부터는 before_dispatch 또는 call_app를 원숭이 패치하는 대신 요청을 받고 Started GET "/session/new" for 127.0.0.1 at 2012-09-26 14:51:42 -0700 비트를 반환하는 메소드가 있습니다.

대신 자신의 로거 또는 원숭이 패치에서 해당 메소드를 재정의 할 수 있습니다.당신이 서브 클래스 (구성 블록 전에로드되어 있는지 URLLogger을) config/application.rb의 미들웨어 체인을 수정하는 것을 잊지 않으면

# or "class Rails::Rack::Logger < ActiveSupport::LogSubscriber" for monkey patch 
class URLLogger < Rails::Rack::Logger 

    def started_request_message(request) 
    'Started %s "%s%s%s" for %s at %s' % [ 
     request.request_method, 
     request.protocol, 
     request.host_with_port, 
     request.filtered_path, 
     request.ip, 
     Time.now.to_default_s ] 
    end 
end 

:

config.middleware.insert_before(Rails::Rack::Logger, URLLogger) 
config.middleware.delete(Rails::Rack::Logger) 
3

난 당신이 좋은하지 않습니다 레일 자체를 변경하지 않고이 작업을 수행 할 수 있다고 생각하지 않습니다,하지만 당신은 당신의 자신의 로그 호출을 추가 할 수 있습니다

class ApplicationController < ActionController::Base 

    before_filter :log_request 

    protected 

    def log_request 
    logger.info("Started #{request.method} #{request.url}") 
    end  

end 
+0

유일한 단점 나는이에 참조 솔루션은 사용자 정의 로그 라인이 주 로그 라인 옆에 있지 않으며 이미지, 자바 스크립트 등을 기록하지 않는다는 것입니다. 후자가 나중에 더 복잡한 프로젝트에서 문제가 될지 확실하지 않습니다. – Pablo

2

내가 지금 사용하고 해결 방법은 생성되었다 이 클래스 : 다음

class HostnameLogger 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    uri = env["REQUEST_URI"] 
    if uri.blank? # While testing a Rails app, there's no env["REQUEST_UIR"] defined. 
     uri = "http://#{env["HTTP_HOST"]}#{env["PATH_INFO"]}" 
    end 
    Rails.logger.info "Started #{env["REQUEST_METHOD"]} \"#{uri}\" for #{env["REMOTE_ADDR"]} at #{Time.now}" 
    @app.call(env) 
    end 
end 

및 (application.rb에서) 랙 미들웨어로 추가 그래서

config.middleware.use "HostnameLogger" 

I GE t : // localhost를 :

은 2011-08-27 15시 33분 40초 0200

에서 127.0.0.1에 대한 GET "/ 사용자/로그인을"시작 "는 HTTP GET 시작 3000/사용자/로그인 "에서 127.0.0.1로 2011-08-27 15:33:40 +0200

5

라인은 미니어처 Rails::Rack::Logger에서 오는 것으로, 이는 난간입니다. 간단한, 당신은 단지 초기화에서, 예를 들어, 로깅을 수행하는 방법을 재정의 할 수 있습니다 : 당신이 오히려 로거를 오버라이드 (override)하지 않는 게 좋을 경우

class Rails::Rack::Logger < ActiveSupport::LogSubscriber 
    protected 

    def before_dispatch(env) 
    request = ActionDispatch::Request.new(env) 
    info "\n\nStarted #{request.request_method} \"#{request.url}\" for #{request.ip} at #{Time.now.to_default_s}" 
    end 
end 

, 당신은 항상 당신이 이미 만든 이는 자신을 추가 할 수 있습니다 당신은 당신이 ActionDispatch::Request의 그것의 사용을 위해 랙 로거를 확인 할 수이 경로를 이동하는 경우

config.middleware.insert_before(Rails::Rack::Logger, YourLogger) 
config.middleware.delete(Rails::Rack::Logger) 

, 그리고 로그 가입자 캐시를 플러시의 수행 다른 일을해야합니다 : 다음을 통해 스택에서 Rails::Rack::Logger 삭제 파견 후, ActiveSupport::LogSubscriber.flush_all!

+0

매우 유익한, 고마워. – Pablo

+0

이 스 니펫을 레일 프로젝트에 적용했는데 내 개발 환경에서는 제대로 작동하지만 프로덕션 환경에서는 제대로 작동하지 않습니다. 아직도 모르겠다 왜 – Frankel

+0

그냥 추측하지만 생산 로그 수준이'info'보다 높습니까? 이 답변은 더 이상 최신 정보가 아닙니다. 랙 로거가 변경되었습니다. – numbers1311407

0
Rails::Rack::Logger.class_eval do 
    protected 
    def started_request_message(request) 
    "Started #{request.request_method} \"#{request.url}\" for #{request.ip} at #{Time.now.to_default_s}" 
    end 
end 
관련 문제