2011-10-19 8 views
5

Bu iki bölümlü bir sorudur, ancak aynı cevaba sahip olabilir.Raylarda daha iyi taneli kayıt seçenekleri aranıyor. Tüm istekleri ve/veya bireysel filtreleri alternatif günlük dosyalarına nasıl kaydedebilirim?

Bölüm: Bizim uygulamamızda, belirli bir kontrolör çok çarpar - diğer tüm istekleri ayrı bir dosyada yapmış olmanız istediğimiz o kadar ki. FoosController.logger'ın ayarlanması benim aradığım şey değil, çünkü istek, bazı lib dosyalarını ve logger nesnesine sahip aktif kayıt nesnesini çalıştırıyor ve raylar, söz konusu kontrol ünitesine kontrolü vermeden önce bazı bilgileri kaydedecektir.

Bölüm: Filtre çoğu denetleyicileri çoğu eylemleri önce çalıştırılır bizim kök application_controller.rb dahil önce Biz global var. Bu before_filter, günlüklerde çok titizdir ve tüm günlük bilgilerinin ayrı bir dosyaya gönderilmesini sağlayan bir adaydır. Bu filtreden önce ayrıca, logger'la kendi referansları olan lib ve ActiveRecord kodlarını çağırır.

Tek bir çözüm, tek denetleyiciyi kendi bağımsız uygulaması olarak çalıştırmaktır. Henüz denemedim, çünkü uygulamanın içlerine oldukça bağlı. Bu yaklaşım ayrıca, before_filter ile yardımcı olmaz.

Ray uygulamalarında daha ince ölçekli günlük kaydı için iyi bir çözüm var mı?

Teşekkürler! kısmı için

cevap

1

Ben Ben, muhtemelen yakut logger (1) devralan (kendi logger sınıfını yaratarak kaydedici belirli bir dosyaya o günlüğüne dayalı istek url filtrelemek ve var tavsiye .

kısmı için II kolay çözüm sadece bu yöntemlerin için ayrı kayıt kullanımı olacaktır. Bunun yerine logger.debug ait "mesajınız" sadece "mesajınız" method_logger.debug diyoruz.

kendi logger oluşturma Basit, sadece ruby ​​logger sınıfını kullanın (1). g kodu, ray uygulamanızın logs dizinindeki my_method.log dosyasına giriş yapan bir logger oluşturur.

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

Daha sonra raylar yanı Yakut logger kullanır olarak size tanıdık gelecektir şu komutla, ile çetele tutabilir.

method_logger.debug "your debug message here" 

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

1

Bölüm I'i çözmek için kullanabileceğiniz özel bir günlük kaydı için kod. Yanıtın satır içi yorumları dahil olmak üzere, another Stack Overflow question'dan kendi kullanımım için uyarladım.

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 
: Sonra uygulama yapılandırmasında dahil

# 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 

: ana farkları geliştirme ve üretim için farklı bir günlük yolu belirtebilmenizdir

İlgili konular