कंसोल में SQL लॉगिंग रेल को अक्षम करें


262

जब मैं कंसोल में कमांड निष्पादित कर रहा होता हूं तो SQL क्वेरी लॉगिंग को अक्षम करने का एक तरीका है? आदर्श रूप से, यह बहुत अच्छा होगा यदि मैं इसे अक्षम कर सकता हूं और इसे कंसोल में कमांड के साथ फिर से सक्षम कर सकता हूं।

मैं कुछ डीबग करने की कोशिश कर रहा हूं और कुछ प्रासंगिक डेटा को प्रिंट करने के लिए "पुट" का उपयोग कर रहा हूं। हालाँकि, sql क्वेरी आउटपुट को पढ़ना मुश्किल बना रहा है।


संपादित करें: मुझे एक और समाधान मिला, लकड़हारा को शून्य पर सेट करने के बाद से कभी-कभी एक त्रुटि हुई, अगर मेरे कोड के अलावा कुछ और लकड़हारा को कॉल करने की कोशिश की गई।

लकड़हारे को सेट करने के बजाय nilआप लकड़हारे का स्तर निर्धारित कर सकते हैं 1

ActiveRecord::Base.logger.level = 1 # or Logger::INFO

since setting the logger to nil sometimes raised an errorयाप .. मैं इस एक जब भागने की कोशिश कर मिला rake db:migrate stackoverflow.com/questions/1719212/...
abbood

3
यह पुष्टि करते हुए कि यह एक आरंभिक में रेल 4.1.0 में काम करता है।
अमल चौधरी

जवाबों:


314

इसे बंद करने के लिए:

old_logger = ActiveRecord::Base.logger
ActiveRecord::Base.logger = nil

इसे वापस चालू करने के लिए:

ActiveRecord::Base.logger = old_logger

1
क्या मैं कहीं भी रख सकता हूं इसलिए मैं SQL आउटपुट को स्थायी रूप से अक्षम कर सकता हूं? मैंने इसे envs / dev.rb में जोड़ने की कोशिश की, लेकिन भाग्य से नहीं।
samvermette

5
आप इस कोड को डाल सकते हैं .irbrc, जो मूल रूप .bashrcसे रेल कंसोल के लिए है। वास्तव में आप चाहें तो कुछ भी कर सकते .irbrcहैं, उदाहरण के लिए, वाक्यविन्यास रंग, इतिहास, vi में कोड संपादित करें और फिर इसे रेल कंसोल में निष्पादित करें, आदि utility_beltयदि आप रूबी 1.8 या रूबी 1.9 पोर्ट पर हैं तो मेरे मणि की जांच करें। कहा जाता हैflyrb
गिल्स बोकेट

2
@ गिल्स बकेट: वास्तव में, .irbrcजैसा है .bashrcलेकिन वास्तव में आपके रूबी इंटरएक्टिव कमांडलाइन के लिए है। यह कोई रेल की बात नहीं है। यदि आप रेल पटरियों के बाहर irb चला रहे थे, तो यदि आप रेलगाड़ियों को संदर्भित करने का प्रयास करते हैं तो आपको शायद त्रुटियां मिलेंगी।
१२:०२ पर एरेमेजिट

9
@samvermette आप इसे एक विन्यास फाइल में कर सकते हैं। उदाहरण के लिए:config/initializers/activerecord_logger.rb
उरई

15
ActiveRecord::Base.logger.level = 1यदि आप .info और अन्य का उपयोग करते हैं तो यह एक बेहतर जवाब नहीं है क्योंकि यह अपवाद नहीं बढ़ाएगा।
डर्टी हेनरी

72

यहाँ एक भिन्नता है जिसे मैं कुछ हद तक क्लीनर मानता हूँ, जो अभी भी एआर से संभावित अन्य लॉगिंग की अनुमति देता है। विन्यास / वातावरण / विकास में।

config.after_initialize do
  ActiveRecord::Base.logger = Rails.logger.clone
  ActiveRecord::Base.logger.level = Logger::INFO
end

विषम, मेरे लिए नहीं, रेल 3.0 या 3.1 में। आपके Rails.logger को after_initialize ब्लॉक में क्यों शून्य किया जाएगा, क्या आपने अपनी रेल इनिट स्टैक को कस्टमाइज़ करने के लिए कुछ और किया था, या आप config.after_initialize को भूल गए थे?
jrochkind

1
मेरे रेल 3.1 ऐप में बढ़िया काम करता है। Seemsl सबसे अच्छा समाधान ike। +1
मार्टिज़न

मेरे लिए काम नहीं करता है ... after_initialize ब्लॉक में स्तर ठीक सेट करता है, लेकिन कंसोल के खुलने तक स्तर 0 पर वापस आ जाता है। अजीब। (मैं प्रॉय को कंसोल रिप्लेसमेंट के रूप में इस्तेमाल कर रहा हूं, क्या ऐसा क्यों है?)
माइक बेलीथ

63

यह कंसोल के लिए एक उपयुक्त समाधान नहीं हो सकता है, लेकिन रेल में इस समस्या का एक तरीका है: लॉगर # साइलेंस

ActiveRecord::Base.logger.silence do
  # the stuff you want to be silenced
end

4
केवल रेल 3 के लिए काम करेंगे: "चेतावनी चेतावनी: मौन पदावनत है और रेल 4.0 से हटा दिया जाएगा"
कंगूर

6
@ कांगुर मैं ४.२ पर हूँ और मौन ठीक काम कर रहा है
बेंजामिन क्राउज़ियर

2
@ कंगूर मैं इस बात की पुष्टि भी कर सकता हूं कि रेल्स 4.2 पर ठीक काम करती है
ग्रेग मैथ्यू क्रॉसली

6
रेल 5 में काम करता है और मुझे कोई चेतावनी नहीं दिखती है। यह सबसे अच्छा जवाब है IMO।
ओवरलोड ११

1
पटरियों 6 में ठीक काम करता है। शायद यह सिर्फ एक बिट के आसपास ले जाया गया है?
4

16

रेल 4 के लिए आप निम्नलिखित को एक पर्यावरण फ़ाइल में रख सकते हैं:

# /config/environments/development.rb

config.active_record.logger = nil

यह केवल उत्पादन में प्रभावी होगा, जहां लॉगिंग वैसे भी अधिशेष है ....
Rob

13

यदि कोई वास्तव में SQL स्टेटमेंट लॉगिंग (लॉगिंग स्तर को बदले बिना, और अपने AR मॉडल से लॉगिंग को रखे बिना) दस्तक देना चाहता है :

लॉग (रेल में 3.2.16, वैसे भी) को लिखने वाली लाइन कॉल टू debugइन है lib/active_record/log_subscriber.rb:50

उस डिबग विधि द्वारा परिभाषित किया गया है ActiveSupport::LogSubscriber

तो हम इसे इस तरह से ओवरराइट करके लॉगिंग को समाप्त कर सकते हैं:

module ActiveSupport
  class LogSubscriber
    def debug(*args, &block)
    end
  end
end

अच्छा था। यह Rails.logger.debugबयानों को प्रभावित किए बिना SQL लॉगिंग पर काम करता है ।
तेमू लीस्टी

यहाँ कुल noob। हमें वास्तव में यह कहां रखना चाहिए?
डेविस

मैं इसे lib / monkeypatch.rb में रखने के लिए और राशि रेल config / application.rb में निम्नलिखित लाइन के साथ में खींच: Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }। ध्यान रखें कि कुछ पर बंदरों का शिकार किया जाता है। संभवतः इसे आपके उत्पादन कोड में नहीं देखना चाहिए।
फर्जीवाड़ा

8

मैंने इसका उपयोग किया: config.log_level = :info संपादन-इनconfig/environments/performance.rb

मेरे लिए बहुत अच्छा काम करना, SQL आउटपुट को अस्वीकार करना, और केवल रेंडरिंग और महत्वपूर्ण जानकारी दिखाना।


मैं 4.1.0 रेल पर हूँ और यह मेरे लिए ठीक काम कर रहा है। धन्यवाद
ज़कारिया

4

रेल 3.2 में मैं विन्यास / पर्यावरण / विकास में कुछ ऐसा कर रहा हूं।

module MyApp
  class Application < Rails::Application
    console do
      ActiveRecord::Base.logger = Logger.new( Rails.root.join("log", "development.log") )
    end
  end
end

2

एक FYI के रूप में, रेल 2 में आप कर सकते हैं

ActiveRecord::Base.silence { <code you don't want to log goes here> }

स्पष्ट रूप से घुंघराले ब्रेसिज़ को do endयदि आप चाहते हैं तो एक ब्लॉक से बदला जा सकता है ।

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