2011-10-19 8 views
5

यह दो भाग प्रश्न है, लेकिन एक ही जवाब हो सकता है।रेल में बेहतर अनाज वाले लॉगिंग विकल्पों की तलाश। मैं वैकल्पिक लॉग फ़ाइलों में पूरे अनुरोध और/या व्यक्तिगत फ़िल्टर कैसे लॉग कर सकता हूं?

भाग एक: हमारे ऐप्लिकेशन में, एक विशेष नियंत्रक एक बहुत हिट हो - इतना कि हम चाहते हैं, उनके लिए यह अन्य सभी अनुरोधों से अलग एक फ़ाइल में लॉग इन होना। FoosController.logger को सेट करना वह नहीं है जिसे मैं ढूंढ रहा हूं, क्योंकि अनुरोध कुछ lib फ़ाइलों और सक्रिय रिकॉर्ड ऑब्जेक्ट का उपयोग करता है जिसमें उनके लॉगर ऑब्जेक्ट होते हैं, और रेल प्रश्न में नियंत्रक को नियंत्रण देने से पहले कुछ जानकारी लॉग करेंगे।

भाग दो: हम एक वैश्विक से पहले फिल्टर है कि ज्यादातर नियंत्रकों के सबसे कार्रवाई से पहले चलाया जाता है हमारे जड़ application_controller.rb में शामिल किया है। यह पहले_फिल्टर लॉग में बहुत शब्दशः है, और इसकी सभी लॉगिंग जानकारी को एक अलग फ़ाइल में भेजने के लिए एक उम्मीदवार है। फिल्टर से पहले यह libs और ActiveRecord कोड को लॉगर में अपने स्वयं के जनमत के साथ भी कॉल करता है।

एक संभावित समाधान एकल नियंत्रक को अपने स्वयं के स्टैंडअलोन एप्लिकेशन के रूप में चलाने का एक संभावित समाधान है। मैंने अभी तक यह कोशिश नहीं की है, क्योंकि यह ऐप के आंतरिक में बहुत सुंदर है। यह दृष्टिकोण पहले_फिल्टर से भी मदद नहीं करेगा।

क्या रेल ऐप्स में अधिक बढ़िया लॉगिंग के लिए कोई अच्छा समाधान है?

धन्यवाद!

उत्तर

1

भाग के लिए मैं मैं अपनी खुद की लकड़हारा वर्ग (बनाने संभवतः रूबी लकड़हारा (1) से इनहेरिट, लकड़हारा अनुरोध यूआरएल को फ़िल्टर और एक विशिष्ट फ़ाइल के लिए लॉग के आधार पर सलाह देते हैं।

भाग के लिए द्वितीय सबसे आसान समाधान सिर्फ इन तरीकों के लिए एक अलग लकड़हारा उपयोग करने के लिए किया जाएगा। logger.debug के बजाय "अपने संदेश" तुम सिर्फ method_logger.debug "आपके संदेश" बनाना अपनी खुद की लकड़हारा है कहते हैं।

सरल, बस रूबी लॉगर क्लास (1) का उपयोग करें। फॉलोइन जी कोड एक लॉगर बनाता है जो आपके रेल अनुप्रयोग के लॉग डीआईआर में my_method.log फ़ाइल पर लॉग करता है।

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

फिर आप निम्न आदेश, के रूप में रेल रूबी लकड़हारा रूप में अच्छी तरह का उपयोग करता है जो आप परिचित दिखना चाहिए के साथ अपने लॉग में लिख सकते हैं।

method_logger.debug "your debug message here" 

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

1

यहां एक कस्टम लॉगर के लिए कोड है जिसका उपयोग आप भाग 1 को हल करने के लिए कर सकते हैं। मैंने इसे another Stack Overflow question से अपने स्वयं के उपयोग के लिए अनुकूलित किया है, यहां तक ​​कि उत्तरदाता की इनलाइन टिप्पणियां भी शामिल हैं।

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 
:

# 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 

फिर अपने आवेदन विन्यास में यह शामिल हैं: मुख्य अंतर यह है कि आप विकास और उत्पादन के लिए एक अलग लॉग पथ निर्दिष्ट कर सकते हैं

संबंधित मुद्दे

 संबंधित मुद्दे