रेक रेक कार्यों में बनाम लकड़हारा डालता है


108

एक रेक कार्य में अगर मैं कमांड का उपयोग करता हूं तो मुझे कंसोल पर आउटपुट दिखाई देता है। हालांकि मैं लॉग फ़ाइल में उस संदेश को नहीं देखूंगा जब एप्लिकेशन उत्पादन पर तैनात किया गया हो।

हालाँकि अगर मैं Rails.logger.info कहता हूं तो विकास मोड में मुझे कंसोल पर कुछ भी नहीं दिख रहा है। मुझे लॉग फाइल में जाना है और पूंछना है।

मैं आदर्श रूप से Rails.logger.info का उपयोग करना चाहूंगा और रेक कार्य के अंदर विकास मोड में, लकड़हारा से आउटपुट को कंसोल पर भी भेजा जाना चाहिए।

वहाँ एक तरीका है कि प्राप्त करने के लिए है?

जवाबों:


57

इसे application.rbया एक रेक कार्य में कोड इनिशियलाइज़ करें

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

यह रेल 3 कोड है। ध्यान दें कि यह लॉगिंग को ओवरराइड करेगा development.log। यदि आप दोनों चाहते हैं STDOUTऔर development.logआपको एक आवरण समारोह की आवश्यकता होगी।

यदि आप इस व्यवहार को केवल रेल कंसोल में चाहते हैं, तो कोड का समान ब्लॉक अपने में रखें ~/.irbrc


26
क्या इसे सिर्फ Rails.logger = Logger.new(STDOUT)विकास में लाना आसान नहीं होगा ।
Ghempton

रेल 2 के लिए, अपने development.rb में रखते:config.logger = Logger.new(STDOUT)
jsarma

38

इसे प्राप्त करने के लिए आप एक नया रेक कार्य बना सकते हैं।

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

इस तरह जब आप अपने रेक कार्य को अंजाम देते हैं तो आप पहले to_stdout जोड़ सकते हैं स्टडआउट लॉग संदेश प्राप्त करने के लिए या इसे डिफ़ॉल्ट लॉग फ़ाइल पर भेजे गए संदेशों को शामिल करने के लिए शामिल न करें

rake to_stdout some_task

11

उपयोगकर्ता द्वारा कमांड-लाइन पर रेक कार्य चलाए जाते हैं। जो कुछ भी उन्हें तुरंत जानना आवश्यक है ("संसाधित 5 पंक्तियों") को टर्मिनल पर आउटपुट होना चाहिए puts

कुछ भी जो पोस्टरिटी के लिए रखा जाना चाहिए ("jsmith@example.com को भेजा गया चेतावनी ईमेल") को भेजा जाना चाहिए Rails.logger


17
क्रोन के साथ रेक कार्यों को चलाना असामान्य नहीं है।
जोहान्स गोर्सेट

2
सच। यदि आप चाहते हैं कि क्रोन जॉब पूरी होने पर आपको लॉग संदेश भेजे जाएं, तो उन्हें $ stdout या $ stderr पर थूक दें।
जोनाथन जूलियन

10

मैं कहूंगा कि प्रयोग करने Rails.logger.infoका तरीका है।

आप इसे सर्वर कंसोल में नहीं देख पाएंगे क्योंकि यह सर्वर से नहीं चलेगा। बस एक नया कंसोल और tail -fलॉग फ़ाइल खोलें , यह चाल चलेगा।

कई उपयोगकर्ता UNIX® कमांड 'टेल' के बारे में जानते हैं, जिसका उपयोग किसी बड़ी फ़ाइल की अंतिम कुछ पंक्तियों को प्रदर्शित करने के लिए किया जा सकता है। लॉग फाइल आदि देखने के लिए यह उपयोगी हो सकता है।

कुछ स्थितियों में और भी अधिक उपयोगी, 'टेल' कमांड के लिए '-f' पैरामीटर है। यह फ़ाइल के आउटपुट को 'फॉलो' करने का कारण बनता है। प्रारंभ में, प्रतिक्रिया अपने आप में 'पूंछ' के लिए समान होगी - फ़ाइल की अंतिम कुछ पंक्तियों को प्रदर्शित किया जाएगा। हालाँकि, कमांड प्रॉम्प्ट पर वापस नहीं आता है, और इसके बजाय, फ़ाइल को 'फॉलो' करना जारी रखता है। जब फ़ाइल में अतिरिक्त लाइनें जोड़ी जाती हैं, तो उन्हें टर्मिनल पर प्रदर्शित किया जाएगा। यह लॉग फाइल, या किसी अन्य फाइल को देखने के लिए बहुत उपयोगी है जिसे समय के साथ जोड़ा जा सकता है। इस और अन्य पूंछ विकल्पों पर अधिक विवरण के लिए 'मैन टेल' टाइप करें।

(के माध्यम से )


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

10
यहां तक ​​कि बेहतर है कि tailf"यह टेल-एफ के समान है लेकिन जब यह नहीं बढ़ रहा है तो फ़ाइल तक पहुंच नहीं करता है" (मैनपेज से)। यह बहुत छोटा है
MBO

@tomas सर्वर लॉग कंसोल को कम क्यों नहीं कर रहा है और केवल टेल-एफ रनिंग के साथ एक कंसोल है? वैसे भी यह कोई वास्तविक समस्या नहीं है ... मैं 8 कंसोल की तरह चल रहा हूं, जो मेरे ऐप में चल रहा है, बस टैब के बीच स्विच करें जब आप सिस्टम के एक विशिष्ट हिस्से पर काम कर रहे हैं कोई बड़ी बात नहीं imho
marcgg

@ म्बो अच्छा :) हलास ऐसा नहीं लगता कि यह मेरी मशीन पर उपलब्ध है (मैक ओएस @ तेंदुआ)
'17

1
@marcgg: मेरे पास "सर्वर कंसोल" नहीं है (मैं यात्री का उपयोग करता हूं), लेकिन सवाल रेक कार्यों के बारे में है और यदि आप एक टर्मिनल विंडो से कोई कार्य चलाते हैं, तो आप उस विंडो में लकड़हारे से कुछ भी नहीं देखते हैं। आउटपुट को देखने के लिए आपके पास development.log के साथ एक और विंडो होनी चाहिए। आदर्श रूप में मैं किसी भी तरह Rails.logger को एक अन्य आउटपुट स्ट्रीम के रूप में स्टडआउट जोड़ूंगा, लेकिन मूल को हटा नहीं सकता।
टॉमस मार्कोस्कास

9

कोड

रेल 4 और नए के लिए, आप लॉगर प्रसारण का उपयोग कर सकते हैं ।

यदि आप विकास मोड में रेक कार्यों के लिए STDOUT और फ़ाइल लॉगिंग दोनों प्राप्त करना चाहते हैं, तो आप इस कोड को इसमें जोड़ सकते हैं config/environments/development.rb:

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

परीक्षा

उपरोक्त कोड का परीक्षण करने के लिए यहाँ एक छोटा सा कार्य है:

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

रनिंग rake stdout_and_log:testआउटपुट

HELLO FROM PUTS
HELLO FROM LOGGER

जबकि

HELLO FROM LOGGER

में जोड़ा गया है log/development.log

रनिंग rake stdout_and_log:test RAILS_ENV=productionआउटपुट

HELLO FROM PUTS

जबकि

HELLO FROM LOGGER

में जोड़ा गया है log/production.log


रेल 5 में, basename($0) == 'rake'चाल अब काम नहीं करती है, क्योंकि railsकमांड खुद चलती है rake। मैं इसके लिए एक कार्य के आधार पर एक अच्छा प्रतिस्थापन ढूंढना पसंद करूंगा जो कि सेट अप करता है broadcast। (वह हिस्सा, कम से कम, अभी भी ठीक काम करता है।)
ब्रेंट रॉयल-गॉर्डन

@ ब्रेंटरॉयल-गॉर्डन विकास में इस सशर्त की कोई आवश्यकता नहीं है, आप बस Rakefileअपनी परियोजना के मूल में कोड जोड़ सकते हैं
मौरिसियो पास्क्वियर जुआन

4

एप्लिकेशन हेल्पर बनाने के बारे में कैसे पता चलता है कि कौन सा वातावरण चल रहा है और सही काम करता है?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

फिर पुट या logger.info के बजाय output_debug पर कॉल करें


5
मुझे नहीं लगता कि यह एक अच्छा विचार है। रेल लकड़हारा को विन्यास योग्य माना जाता है, लेकिन उस विन्यास का उपयोग करने के बजाय आप इसके ऊपर और अधिक परतें जमा कर रहे हैं।
सिजमेन मूलर

हां, यह एक अच्छा विचार नहीं है क्योंकि एक ही चेक हर बार जब आप कुछ लॉग इन करना चाहते हैं तो किया जाएगा ।
फरिभवेश 18

3

मॉडल में STDOUT में लकड़हारे को पुनर्निर्देशित करने के लिए रेल्स 2.X:

ActiveRecord::Base.logger = Logger.new(STDOUT)

नियंत्रकों में लकड़हारा पुनर्निर्देशित करने के लिए:

ActionController::Base.logger = Logger.new(STDOUT)

मुझे यह लेख भी मिला, बहुत उपयोगी sepcot.com/blog/2009/08/rails-log-to-stdout
तानिया आर

2

'और' के साथ एक पृष्ठभूमि नौकरी निष्पादित करें और स्क्रिप्ट / कंसोल खोलें या जो भी हो .. इस तरह आप एक ही विंडो में कई कमांड चला सकते हैं।

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

नोट लॉगिंग आउटपुट का एक बहुत होने पर जल्दी से मैला हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.