में एक विशिष्ट नियंत्रक के लिए लॉगर आउटपुट को रीडायरेक्ट करें मैंने रेल के लिए अपने पिछले प्रश्न Redirect logger output for a specific controller in Rails 3 में उत्तर के आधार पर एक समाधान बनाया है। हालांकि यह बहुत अच्छा काम करता है, हालांकि अब मैं रेलवे के समान मध्यवर्ती आधारित समाधान को लागू करने की कोशिश कर रहा हूं 4 प्रोजेक्ट लेकिन काम करने से एक ही समाधान को रखने में कुछ मतभेद हैं।रेल 4
रेल 3 समाधान:
module MyApp
class LoggerMiddleware
REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*|
REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"
def initialize(app)
@app = app
@logger = Rails::logger
.instance_variable_get(:@logger)
.instance_variable_get(:@log)
@reports_api_controller_logger = Logger.new(
Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE),
10, 1000000)
end
def call(env)
Rails::logger
.instance_variable_get(:@logger)
.instance_variable_set(:@log,
case env['PATH_INFO']
when REPORTS_API_CONTROLLER_PATH then
@reports_api_controller_logger
else
@logger
end
)
@app.call(env)
end
end
end
Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware
ऊपर में
:
रेल Rails.logger = Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
रेल 3 Rails.logger के लिए सेटर के लिए 3 गेटर (स्थापित करने @my_logger पर) = Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)
एक बात जो मैंने अभी देखी है वह है कि रेल 4 में Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
शून्य लौटाता है।
रेल 4 कंसोल में जाँच हो रही है, मुझे लगता है कि Rails.instance_variable_get(:@logger)
रिटर्न #<ActiveSupport::Logger:0x007f84ff503a08 ....>
मैं Rails.instance_variable_get(:@logger)
साथ गेटर और Rails.instance_variable_set(:@logger,my_logger)
साथ सेटर की जगह की कोशिश की है और यह लगभग काम करने लगता है है। गतिविधि का पहला भाग, "प्रारंभ ..." नई लॉग फ़ाइल पर जाता है लेकिन उसके बाद सबकुछ डिफ़ॉल्ट लॉग फ़ाइल पर जाता है (मध्यवर्ती से पहले Rails.logger इसे बदल देता है)।
या तो Rails.instance_variable_get(:@logger)
/रेल 4 में सबसे कम स्तर बराबर रेल 3 Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)
के लिए हो रही करने के लिए नहीं है की स्थापना Rails.logger या वहाँ है कि उसके बाद मैं इस सेट को अधिलेखित मेरी मिडलवेयर के बाद प्रक्रिया में बाद में कुछ और ही है यह।
कोई सुराग?
अद्यतन:
स्पष्ट करने के लिए समाधान काम करता है ऊपर तैनात रेल 3. में अपेक्षा के अनुरूप किसी भी सीमाओं यह या विशेष वातावरण (जैसे अगर समाधान सर्वर वातावरण सूत्रण में काम नहीं कर सकता के रूप में में नहीं हो सकता है हो सकता है यदि यह मामला है) इस समय ठीक है और इस समय बाधाओं के रूप में अनुभव नहीं किया गया है इसलिए इस प्रश्न के लिए रेल 4 समाधान में भी यही सीमाएं ठीक हैं।
अफैक एक ही लॉगर इंस्टेंस थ्रेड के बीच साझा किया जाता है, इसलिए यदि आप थ्रेडिंग सर्वर का उपयोग करते हैं, या भविष्य में ऐसा करने का अवसर चाहते हैं तो सुनिश्चित करें कि "विशेष" के प्रसंस्करण के दौरान समानांतर अनुरोधों को आउटपुट न करें नियंत्रक "(प्यूमा + सी रूबी थ्रेड को अबोकू तैनाती रणनीति पसंद है इसलिए तर्क केवल अकादमिक नहीं है) – bbozo
हाय @ बबोजो, टिप्पणी के लिए धन्यवाद। हम इस समय थ्रेडिंग सर्वर के साथ जानबूझकर कुछ भी नहीं कर रहे हैं। क्या यह संभव है कि यह डिफ़ॉल्ट रूप से कहीं भी सेटअप हो और मुझे इसके बारे में पता नहीं है? यदि हमने कहा है कि "थ्रेडिंग सर्वर" को लागू करने का निर्णय लिया गया है, तो इस दृष्टिकोण में कौन से संशोधन हैं, तो हम आपको वही परिणाम दे सकते हैं? – Streamline
हाय @Streamline, रेल 4 अनुप्रयोग डिफ़ॉल्ट रूप से थ्रेड किए जाते हैं। यह परिवर्तन रेल 4 के साथ पेश किया गया था। रेल 3 में आपको स्पष्ट रूप से 'config.threadsafe' के साथ बहु थ्रेड समर्थन सक्षम करना था। मुझे लगता है कि आपके रेल 4 एप्लिकेशन समवर्ती धागे चलाते हैं जो Rails.logger सेटिंग को एक गैर-निर्धारक तरीके से ओवरराइड कर रहे हैं। यह समझाएगा कि यह थोड़ी देर के बाद काम करने के लिए बंद हो जाता है। – Tawan