ปิดใช้งานการเข้าสู่ระบบ Rails SQL ในคอนโซล


262

มีวิธีการปิดใช้งานการบันทึกแบบสอบถาม SQL เมื่อฉันกำลังดำเนินการคำสั่งในคอนโซลหรือไม่ เป็นการดีถ้าหากฉันสามารถปิดการใช้งานและเปิดใช้งานอีกครั้งด้วยคำสั่งในคอนโซล

ฉันพยายามแก้ไขข้อบกพร่องบางอย่างและใช้ "สวม" เพื่อพิมพ์ข้อมูลที่เกี่ยวข้อง อย่างไรก็ตามผลลัพธ์แบบสอบถาม sql ทำให้อ่านยาก


แก้ไข: ฉันพบวิธีแก้ไขปัญหาอื่นเนื่องจากตั้งค่าตัวบันทึกเป็นศูนย์ในบางครั้งทำให้เกิดข้อผิดพลาดหากมีสิ่งอื่นที่ไม่ใช่รหัสของฉันพยายามเรียก logger.warn

แทนการตั้งค่าการตัดไม้เพื่อคุณสามารถตั้งค่าระดับของการตัดไม้ไปยังnil1

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
ยืนยันว่าใช้งานได้กับ Rails 4.1.0 ใน initializer
Amal Chaudhuri

คำตอบ:


314

วิธีปิดใช้งาน:

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

วิธีเปิดใช้งาน:

ActiveRecord::Base.logger = old_logger

1
มีที่ใดบ้างที่ฉันสามารถวางสิ่งนี้เพื่อปิดการใช้งาน SQL เอาต์พุตอย่างถาวร? ฉันพยายามเพิ่มลงใน envs / dev.rb แต่ไม่ใช่โชค
samvermette

5
คุณสามารถใส่รหัสนี้.irbrcซึ่งโดยพื้นฐานแล้ว.bashrcสำหรับคอนโซล Rails ในความเป็นจริงคุณสามารถทำอะไรก็ได้.irbrcถ้าคุณต้องการเช่นสีไวยากรณ์ประวัติแก้ไขรหัสใน vi แล้วดำเนินการในคอนโซล Rails ฯลฯ ตรวจสอบอัญมณีของฉันutility_beltถ้าคุณใช้ Ruby 1.8 หรือ Ruby 1.9 พอร์ต เรียกว่าflyrb
Giles Bowkett

2
@giles bowkett: จริงๆแล้ว.irbrcมันเป็นเหมือน.bashrcแต่จริงๆแล้วสำหรับcommandline ทับทิมของคุณ มันไม่ใช่เรื่องทางรถไฟ ฉันคิดว่าคุณอาจได้รับข้อผิดพลาดถ้าคุณพยายามอ้างอิงคลาสของทางรถไฟเมื่อคุณเรียกใช้ irb นอกสภาพแวดล้อมทางรถไฟ
eremzeit

9
@samvermette คุณสามารถทำได้ในไฟล์ปรับแต่ง ตัวอย่างเช่น:config/initializers/activerecord_logger.rb
Uri

15
ActiveRecord::Base.logger.level = 1เป็นคำตอบที่ดีกว่ามากเพราะจะไม่เพิ่มข้อยกเว้นหากคุณใช้. info และอื่น ๆ
เฮนรี่สกปรก

72

นี่คือรูปแบบที่ฉันคิดว่าค่อนข้างสะอาดกว่าซึ่งยังอนุญาตการบันทึกอื่น ๆ ที่มีศักยภาพจาก AR ใน config / environment / development.rb:

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

แปลกไม่ใช่สำหรับฉันใน Rails 3.0 หรือ 3.1 ทำไม Rails.logger ของคุณจะเป็นศูนย์ในบล็อก after_initialize คุณทำอย่างอื่นเพื่อปรับแต่ง Rails init stack ของคุณหรือคุณลืม config.after_initialize
jrochkind

1
ใช้งานได้ดีในแอป Rails 3.1 ของฉัน ดูเหมือนว่าทางออกที่ดีที่สุด +1
Martijn

ใช้งานไม่ได้สำหรับฉัน ... ตั้งค่าระดับ OK ในบล็อก after_initialize แต่ระดับกลับเป็น 0 ตามเวลาที่คอนโซลเปิด แปลก. (ฉันใช้ Pry เป็นคอนโซลแทนนั่นเป็นเพราะอะไร)
Mike Blyth

63

นี่อาจไม่ใช่โซลูชันที่เหมาะสมสำหรับคอนโซล แต่ Rails มีวิธีสำหรับปัญหานี้: Logger # silence

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

4
จะใช้งานได้กับ Rails 3 เท่านั้น: "คำเตือนการเลิกใช้งาน: ความเงียบถูกคัดค้านและจะถูกลบออกจาก Rails 4.0"
Kangur

6
@Kangur ฉันอยู่บนราง 4.2 และความเงียบดูเหมือนว่าจะทำงานได้ดี
Benjamin Crouzier

2
@ Kangur ฉันสามารถยืนยันได้ว่าวิธีการนี้ใช้ได้ผลดีกับ Rails 4.2
Greg Matthew Crossley

6
ทำงานใน Rails 5 และฉันไม่เห็นคำเตือนใด ๆ นี่คือคำตอบที่ดีที่สุด IMO
เกิน

1
ทำงานได้ดีใน Rails 6 บางทีมันอาจจะถูกย้ายไปรอบ ๆ บ้าง?
johncip

16

สำหรับ Rails 4 คุณสามารถใส่สิ่งต่อไปนี้ในไฟล์สภาพแวดล้อม:

# /config/environments/development.rb

config.active_record.logger = nil

นั่นจะมีผลในการผลิตเท่านั้นโดยที่การบันทึกส่วนใหญ่ถูกบีบอัดอยู่แล้ว ....
Rob

13

ในกรณีที่มีคนต้องการจริงเคาะออกจากการบันทึกคำสั่ง SQL (โดยไม่ต้องเปลี่ยนระดับการบันทึกและการเข้าสู่ระบบในขณะที่เก็บจากรุ่น AR ของพวกเขา):

บรรทัดที่เขียนลงในบันทึก (ใน Rails 3.2.16 แล้ว) คือการเรียกร้องให้debugในlib/active_record/log_subscriber.rb:50ใน

วิธีการตรวจแก้จุดบกพร่องนั้นถูกกำหนดโดย ActiveSupport::LogSubscriberวิธีการแก้ปัญหาที่ถูกกำหนดโดย

ดังนั้นเราจึงสามารถบันทึกการบันทึกได้โดยเขียนทับมันเช่น:

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

สิ่งที่ดี. สิ่งนี้ใช้ได้กับการบันทึก SQL โดยไม่มีผลกระทบต่อRails.logger.debugคำสั่ง
Teemu Leisti

รวม noob ที่นี่ เราควรใส่สิ่งนี้ไว้ตรงไหน?
devius

ผมเก็บไว้ใน lib / monkeypatch.rb และรางดึงมันด้วยบรรทัดต่อไปนี้ใน config / Dir.glob( "./lib/*.{rb}" ).each{ | file | require file }application.rb: โปรดจำไว้ว่าลิงบางตัวกำลังขมวดคิ้วอยู่ อาจไม่ควรตรวจสอบสิ่งนี้ในรหัสการผลิตของคุณ
fakeleft

8

ฉันใช้สิ่งนี้: config.log_level = :info แก้ไขconfig/environments/performance.rb

ทำงานได้ดีสำหรับฉันปฏิเสธการแสดงผล SQL และแสดงเฉพาะการเรนเดอร์และข้อมูลสำคัญ


ฉันอยู่บนราง 4.1.0 และมันก็ใช้ได้ดีสำหรับฉัน ขอบคุณ
Zakaria

4

ใน Rails 3.2 ฉันกำลังทำสิ่งนี้ใน config / environment / development.rb:

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

2

เช่นเดียวกับ FYI ใน Rails 2 คุณสามารถทำได้

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

เห็นได้ชัดว่าเครื่องมือจัดฟันแบบหยิกอาจถูกแทนที่ด้วยdo endบล็อกหากคุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.