2011-10-19 14 views
5

To jest dwuczęściowe pytanie, ale może mieć tę samą odpowiedź.Poszukuje dokładniejszych opcji rejestrowania w Railsach. Jak mogę logować całe żądania i/lub poszczególne filtry do alternatywnych plików dziennika?

Part One: W naszej aplikacji, jeden konkretny kontroler oberwać dużo - tak bardzo, że chcielibyśmy być rejestrowane w pliku oddzielone od wszystkich innych wniosków. Ustawienie FoosController.logger nie jest tym, czego szukam, ponieważ żądanie wykonuje niektóre pliki lib i aktywny obiekt rekordu, które mają swój obiekt rejestratora, a szyny logują niektóre informacje przed przekazaniem sterowania do kontrolera, o którym mowa.

Part Two: Mamy przed globalnym filtr w naszych application_controller.rb korzeniowego, który jest uruchamiany przed większości działań większości kontrolerów. Ten before_filter jest bardzo rozwlekły w dziennikach i jest kandydatem do wysłania wszystkich informacji o logowaniu do osobnego pliku. Ten wcześniejszy filtr również wywołuje biblioteki i kod ActiveRecord z własnymi referendami rejestratora.

Jednym z możliwych rozwiązań jest uruchomienie pojedynczego kontrolera jako własnej samodzielnej aplikacji. Jeszcze go nie wypróbowałem, ponieważ jest dość związany z wewnętrznymi aplikacjami. Takie podejście również nie pomogłoby w filtrze before_filter.

Czy istnieją jakieś dobre rozwiązania dla bardziej drobiazgowego logowania w aplikacjach szyn?

Dzięki!

Odpowiedz

1

Dla części I Polecam tworząc własne klasy rejestratora (ewentualnie dziedziczenie z rejestratora ruby ​​(1), mają rejestrator odfiltrować URL żądania i na podstawie tego dziennika do określonego pliku.

dla części II najprostszym rozwiązaniem byłoby po prostu użyć rejestratora oddzielna dla tych metod. Zamiast logger.debug „wiadomość” po prostu zadzwonić method_logger.debug „wiadomość”.

Tworzenie własnej rejestrator jest proste, po prostu użyj klasy rejestratora ruby ​​(1) g code tworzy logger, który loguje się do pliku my_method.log w katalogu log twojej aplikacji railsowej.

method_logger = Logger.new(Rails.root.join('logs','my_method.log') 

Można wtedy napisać do dziennika za pomocą następującego polecenia, które powinny wyglądać znajomo ci jak szyny używa rejestrator Ruby, jak również.

method_logger.debug "your debug message here" 

(1) http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html

1

Oto kod niestandardowego rejestratora, którego można użyć do rozwiązania części I. Dostosowałem go do własnego użytku z poziomu another Stack Overflow question, nawet uwzględniając wstawiane komentarze od zgłaszającego.Główną różnicą jest to, że można określić inną ścieżkę dziennika dla rozwoju i produkcji:

# app/concerns/event_notifications_logger.rb 
class EventNotificationsLogger < Rails::Rack::Logger 
    def initialize(app, opts = {}) 
    @default_logger = Rails.logger 

    @notifications_logger = Logger.new(notifications_log_path) 
    @notifications_logger.formatter = LogFormat.new 
    @notifications_logger.level = @default_logger.level 

    @app = app 
    @opts = opts 
    end 

    def call(env) 
    logger = if env['PATH_INFO'] == '/event_notifications/deliver' 
     @notifications_logger 
    else 
     @default_logger 
    end 

    # What?! Why are these all separate? 
    ActiveRecord::Base.logger = logger 
    ActionController::Base.logger = logger 
    Rails.logger = logger 

    # The Rails::Rack::Logger class is responsible for logging the 
    # 'starting GET blah blah' log line. We need to call super here (as opposed 
    # to @app.call) to make sure that line gets output. However, the 
    # ActiveSupport::LogSubscriber class (which Rails::Rack::Logger inherits 
    # from) caches the logger, so we have to override that too 
    @logger = logger 

    super 
    end 

private 

    def notifications_log_path 
    Rails.env.production? ? '/var/log/event-notifications.log' : Rails.root.join('log/event-notifications.log') 
    end 
end 

Następnie umieścić go w konfiguracji aplikacji:

require File.expand_path('../boot', __FILE__) 
require 'rails/all' 

require File.expand_path('../../app/concerns/event_notifications_logger', __FILE__) 

module YourApp 
    class Application < Rails::Application 
    config.middleware.swap Rails::Rack::Logger, EventNotificationsLogger 
    # ... 
    end 
end 
Powiązane problemy