2010-02-11 12 views
88

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

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

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

क्या यह हासिल करने का कोई तरीका है?

+2

+1 मैं सिर्फ एक ही प्रश्न पूछने की योजना बना रहा था। –

उत्तर

9

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

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

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

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

(via)

+0

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

+9

'tailf'' का उपयोग करना बेहतर है "यह tail -f के समान है लेकिन जब यह नहीं बढ़ रहा है तब फ़ाइल तक नहीं पहुंचता है" (मैनपेज से)। यह भी छोटा है – MBO

+0

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

10

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

कुछ भी जो वंशावली के लिए रखा जाना चाहिए ("[email protected] पर चेतावनी ईमेल भेजा गया") Rails.logger पर भेजा जाना चाहिए।

+11

क्रॉन के साथ रेक कार्यों को चलाने के लिए असामान्य नहीं है। –

+2

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

3

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

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

तो कहते हैं की बजाय output_debug फोन या logger.info

+4

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

+0

हां, यह एक अच्छा विचार नहीं है क्योंकि एक ही चेक किया जाएगा * हर बार * आप कुछ लॉग करना चाहते हैं। – furiabhavesh

46

application.rb में इस रखो, या एक रेक कार्य में कोड

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

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

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

+1

मैं इसे रेल 2 में कैसे कर सकता हूं? – Joelio

+23

विकास.आरबी में बस 'Rails.logger = Logger.new (STDOUT)' रखना आसान नहीं होगा? – ghempton

+0

रेल 2 के लिए, इसे अपने विकास में रखें। आरबी: 'config.logger = logger.new (STDOUT)' – jsarma

1

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

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>] 

टिप्पणी जल्दी खराब मिल सकता है जब वहाँ प्रवेश उत्पादन का एक बहुत है।

2

रेल 2.x में मॉडल में STDOUT करने के लिए लकड़हारा रीडायरेक्ट करने के लिए:

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

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

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

मुझे यह लेख भी बहुत उपयोगी पाया गया है http://www.sepcot.com/blog/2009/08/ रेल-लॉगिंग-टू-स्टडआउट –

24

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

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

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

rake to_stdout some_task 
+0

उत्कृष्ट विचार! –

2

कोड

को भेजे गए संदेश के लिए

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

तुम दोनों 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 में जोड़ा गया है।

+0

रेल 5 में, 'बेसनाम ($ 0) ==' रेक 'चाल अब काम नहीं करती है, क्योंकि' रेल 'कमांड स्वयं' रेक 'चलाता है। 'प्रसारण' सेट करने वाले कार्य के आधार पर मुझे इसके लिए एक अच्छा प्रतिस्थापन मिलना अच्छा लगेगा। (वह हिस्सा, कम से कम, अभी भी ठीक काम करता है।) –

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