ทำให้เทียบกับคนตัดไม้ในงานคราดราง


108

ในงานคราดถ้าฉันใช้คำสั่ง puts ฉันจะเห็นผลลัพธ์บนคอนโซล อย่างไรก็ตามฉันจะไม่เห็นข้อความนั้นในไฟล์บันทึกเมื่อแอปถูกปรับใช้ในการผลิต

อย่างไรก็ตามถ้าฉันพูดว่า Rails.logger.info ในโหมดการพัฒนาฉันไม่เห็นอะไรบนคอนโซล ฉันต้องไปที่ไฟล์บันทึกและบอกสิ่งนั้น

ฉันต้องการใช้ Rails.logger.info และในโหมดการพัฒนาภายในงานคราดควรส่งเอาต์พุตจากคนตัดไม้ไปยังคอนโซลด้วย

มีวิธีที่จะบรรลุได้หรือไม่?

คำตอบ:


57

ใส่สิ่งนี้ไว้ในapplication.rbรหัสเริ่มต้นงานคราด

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

นี่คือรหัส Rails 3 development.logหมายเหตุที่ว่านี้จะแทนที่การเข้าสู่ระบบเพื่อ หากคุณต้องการทั้งสองอย่างSTDOUTและdevelopment.logคุณจะต้องมีฟังก์ชัน wrapper

หากคุณต้องการลักษณะการทำงานนี้เฉพาะในคอนโซล Rails ให้วางโค้ดกลุ่มเดียวกันใน~/.irbrcไฟล์.


26
แค่ใส่Rails.logger = Logger.new(STDOUT)development.rb จะไม่ง่ายกว่าเหรอ
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 ก่อนเพื่อรับข้อความบันทึก stdout หรือไม่รวมไว้เพื่อให้มีข้อความที่ส่งไปยังไฟล์บันทึกเริ่มต้น

rake to_stdout some_task

11

งานคราดถูกรันโดยผู้ใช้บนบรรทัดคำสั่ง สิ่งที่พวกเขาจำเป็นต้องรู้ทันที ( "การประมวลผล 5 แถว") ควรจะมีการส่งออกใน terminal putsด้วย

สิ่งที่ตอบสนองความต้องการที่จะเก็บไว้ให้ลูกหลาน ( "ส่งการแจ้งเตือนอีเมลไปยัง jsmith@example.com") Rails.loggerควรจะถูกส่งไปยัง


17
ไม่ใช่เรื่องแปลกที่จะเรียกใช้งานคราดด้วย cron
Johannes Gorset

2
จริง. หากคุณต้องการให้ส่งข้อความบันทึกถึงคุณทางอีเมลเมื่องาน cron เสร็จสิ้นให้พ่นออกไปที่ $ stdout หรือ $ stderr
Jonathan Julian

10

ฉันจะบอกว่าการใช้Rails.logger.infoเป็นวิธีที่จะไป

คุณจะไม่สามารถเห็นได้ในคอนโซลเซิร์ฟเวอร์เนื่องจากจะไม่ทำงานผ่านเซิร์ฟเวอร์ เพียงเปิดคอนโซลใหม่และtail -fล็อกไฟล์ก็จะทำเคล็ดลับ

ผู้ใช้จำนวนมากทราบถึงคำสั่งUNIX® "tail" ซึ่งสามารถใช้เพื่อแสดงไฟล์ขนาดใหญ่สองสามบรรทัดสุดท้าย สิ่งนี้มีประโยชน์สำหรับการดูไฟล์บันทึก ฯลฯ

มีประโยชน์มากยิ่งขึ้นในบางสถานการณ์คือพารามิเตอร์ '-f' ของคำสั่ง 'tail' สิ่งนี้ทำให้ tail "ตาม" ผลลัพธ์ของไฟล์ ในขั้นต้นการตอบสนองจะเหมือนกับ 'tail' ในตัวมันเอง - สองสามบรรทัดสุดท้ายของไฟล์จะปรากฏขึ้น อย่างไรก็ตามคำสั่งไม่กลับไปที่พรอมต์ แต่จะยังคง 'ติดตาม' ไฟล์ต่อไป เมื่อมีการเพิ่มบรรทัดเพิ่มเติมลงในไฟล์บรรทัดเหล่านั้นจะแสดงบนเทอร์มินัล สิ่งนี้มีประโยชน์มากสำหรับการดูไฟล์บันทึกหรือไฟล์อื่น ๆ ที่อาจต่อท้ายเมื่อเวลาผ่านไป พิมพ์ 'man tail' เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้และตัวเลือกหางอื่น ๆ

( ผ่าน )


แต่มันไม่สะดวกสบายมากนักในขณะที่ทำงานบนเครื่องท้องถิ่นเนื่องจากคุณไม่เห็นผลลัพธ์ในหน้าต่างเดียวกับที่คุณเรียกงาน โดยเฉพาะอย่างยิ่งถ้าคุณไม่มีหน้าจอขนาดใหญ่เพื่อให้พอดีกับหลาย ๆ หน้าต่างเคียงข้างกัน
Tomas Markauskas

10
ที่ดีไปกว่านั้นคือใช้tailf"มันคล้ายกับ tail -f แต่ไม่เข้าถึงไฟล์เมื่อมันไม่เติบโต" (จาก manpage) มันสั้นกว่าด้วย
MBO

@tomas ทำไมไม่ย่อขนาดคอนโซลบันทึกเซิร์ฟเวอร์และมีเพียงคอนโซลเดียวที่รัน tail-f? อย่างไรก็ตามมันไม่ใช่ปัญหาที่แท้จริง ... ฉันใช้คอนโซล 8 ตัวติดตามสิ่งที่เกิดขึ้นในแอพของฉันเพียงแค่สลับไปมาระหว่างแท็บเมื่อคุณทำงานในส่วนเฉพาะของระบบไม่ใช่เรื่องใหญ่ imho
marcgg

@mbo nice :) ดูเหมือนว่ามันจะไม่มีในเครื่องของฉัน (mac os @ leopard)
marcgg

1
@marcgg: ฉันไม่มี "เซิร์ฟเวอร์คอนโซล" (ฉันใช้ผู้โดยสาร) แต่คำถามเกี่ยวกับงานคราดและถ้าคุณเรียกใช้งานจากหน้าต่างเทอร์มินัลเดียวคุณจะไม่เห็นอะไรเลยจากตัวบันทึกในหน้าต่างนั้น คุณต้องมีหน้าต่างอื่นที่มี development.log เพื่อดูผลลัพธ์ ตามหลักการแล้วฉันจะเพิ่ม stdout เป็นสตรีมเอาต์พุตอื่นไปยัง Rails.logger แต่ไม่ได้ลบออก
Tomas Markauskas

9

รหัส

สำหรับทางรถไฟ 4 และใหม่กว่าคุณสามารถใช้Logger ออกอากาศ

หากคุณต้องการรับทั้ง 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

ทดสอบ

นี่เป็นงาน Rake ขนาดเล็กเพื่อทดสอบโค้ดด้านบน:

# 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. (อย่างน้อยส่วนนั้นก็ยังใช้ได้ดี)
Brent Royal-Gordon

@ BrentRoyal-Gordon ไม่จำเป็นต้องมีเงื่อนไขนี้ในการพัฒนาคุณสามารถเพิ่มรหัสไปRakefileที่รากของโครงการของคุณ
Mauricio Pasquier Juan

4

วิธีการสร้างตัวช่วยแอปพลิเคชันที่ตรวจจับสภาพแวดล้อมที่ทำงานอยู่และทำสิ่งที่ถูกต้องได้อย่างไร

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

จากนั้นเรียก output_debug แทน puts หรือ logger.info


5
ฉันไม่คิดว่านี่เป็นความคิดที่ดี Rails logger มีจุดมุ่งหมายเพื่อกำหนดค่าได้ แต่แทนที่จะใช้ความสามารถในการกำหนดค่านั้นคุณเพียงแค่ซ้อนเลเยอร์เพิ่มเติมไว้ที่ด้านบน
Sijmen Mulder

ใช่ไม่ใช่ความคิดที่ดีเนื่องจากจะมีการตรวจสอบแบบเดียวกันทุกครั้งที่คุณต้องการบันทึกบางสิ่ง
furiabhavesh

3

ใน Rails 2.X เพื่อเปลี่ยนเส้นทางคนตัดไม้ไปยัง STDOUT ในรุ่น:

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

ในการเปลี่ยนเส้นทางคนตัดไม้ในตัวควบคุม:

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

ฉันยังพบบทความนี้ซึ่งมีประโยชน์มากsepcot.com/blog/2009/08/rails-logging-to-stdout
Tania R

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

หมายเหตุสามารถเลอะเทอะได้อย่างรวดเร็วเมื่อมีเอาต์พุตการบันทึกจำนวนมาก

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