menempatkan vs logger dalam tugas menyapu rel

108

Dalam tugas menyapu jika saya menggunakan perintah put maka saya melihat output di konsol. Namun saya tidak akan melihat pesan itu di file log saat aplikasi diterapkan pada produksi.

Namun jika saya mengatakan Rails.logger.info maka dalam mode pengembangan saya tidak melihat apa pun di konsol. Saya harus pergi ke file log dan mengekor itu.

Idealnya saya ingin menggunakan Rails.logger.info dan dalam mode pengembangan di dalam tugas rake, output dari logger juga harus dikirim ke konsol.

Apakah ada cara untuk mencapai itu?

Nick Vanderbilt
sumber

Jawaban:

57

Masukkan ini ke dalam application.rb, atau dalam tugas menyapu kode inisialisasi

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

Ini adalah kode Rails 3. Perhatikan bahwa ini akan menggantikan logging ke development.log. Jika Anda menginginkan keduanya STDOUTdan development.logAnda memerlukan fungsi pembungkus.

Jika Anda ingin perilaku ini hanya di konsol Rails, tempatkan blok kode yang sama di ~/.irbrc.

shmichael
sumber
26
Bukankah lebih mudah untuk memasukkan Rails.logger = Logger.new(STDOUT)development.rb?
ghempton
Untuk rel 2, letakkan ini di development.rb Anda:config.logger = Logger.new(STDOUT)
jsarma
38

Anda dapat membuat tugas penggaruk baru agar ini berfungsi.

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

Dengan cara ini ketika Anda menjalankan tugas rake Anda, Anda dapat menambahkan to_stdout terlebih dahulu untuk mendapatkan pesan log stdout atau tidak menyertakannya agar pesan dikirim ke file log default

rake to_stdout some_task
Pete Brumm
sumber
11

Tugas rake dijalankan oleh pengguna, pada baris perintah. Apa pun yang perlu mereka ketahui segera ("diproses 5 baris") harus dikeluarkan di terminalputs .

Apa pun yang perlu disimpan untuk anak cucu ("kirim email peringatan ke [email protected]") harus dikirim ke Rails.logger.

Jonathan Julian
sumber
17
Tidak jarang menjalankan tugas rake dengan cron.
Johannes Gorset
2
Benar. Jika Anda ingin pesan log dikirim ke email Anda saat tugas cron selesai, keluarkan ke $ stdout atau $ stderr.
Jonathan Julian
10

Saya akan mengatakan bahwa menggunakan Rails.logger.infoadalah cara untuk pergi.

Anda tidak akan dapat melihatnya di konsol server karena tidak akan berjalan melalui server. Buka saja konsol baru dan tail -ffile log, itu akan melakukan trik.

Banyak pengguna mengetahui perintah 'tail' UNIX®, yang dapat digunakan untuk menampilkan beberapa baris terakhir dari file besar. Ini dapat berguna untuk melihat file log, dll.

Bahkan lebih berguna dalam beberapa situasi, adalah parameter '-f' ke perintah 'tail'. Hal ini menyebabkan tail 'mengikuti' output file. Awalnya, responsnya akan sama dengan 'tail' itu sendiri - beberapa baris terakhir dari file akan ditampilkan. Namun, perintah tersebut tidak kembali ke prompt, dan sebaliknya, terus 'mengikuti' file. Ketika baris tambahan ditambahkan ke file, mereka akan ditampilkan di terminal. Ini sangat berguna untuk melihat file log, atau file lain yang mungkin ditambahkan seiring waktu. Ketik 'man tail' untuk detail lebih lanjut tentang ini dan opsi ekor lainnya.

( melalui )

marcgg
sumber
Tapi itu sangat tidak nyaman saat bekerja pada mesin lokal karena Anda tidak melihat output di jendela yang sama tempat Anda memanggil tugas. Terutama jika Anda tidak memiliki layar besar untuk memuat beberapa jendela secara berdampingan.
Tomas Markauskas
10
Lebih baik lagi menggunakan tailf"Ini mirip dengan tail -f tetapi tidak mengakses file ketika tidak berkembang" (dari halaman manual). Ini juga lebih pendek
MBO
@ Thomas mengapa tidak meminimalkan konsol log server dan hanya memiliki satu konsol dengan tail-f yang berjalan? Bagaimanapun itu bukan masalah nyata ... Saya menjalankan seperti 8 konsol menelusuri apa yang terjadi di aplikasi saya, cukup beralih antar tab saat Anda bekerja pada bagian tertentu dari sistem bukan masalah besar imho
marcgg
@mbo bagus :) halas sepertinya tidak tersedia di mesin saya (mac os @ leopard)
marcgg
1
@marcgg: Saya tidak memiliki "konsol server" (saya menggunakan penumpang), tetapi pertanyaannya adalah tentang tugas menyapu dan jika Anda menjalankan tugas dari satu jendela terminal, Anda tidak melihat apa pun dari logger di jendela itu. Anda harus memiliki jendela lain dengan development.log untuk melihat hasilnya. Idealnya saya akan menambahkan stdout sebagai aliran keluaran lain ke Rails.logger, tetapi tidak menghapus yang asli.
Tomas Markauskas
9

Kode

Untuk Rails 4 dan yang lebih baru, Anda dapat menggunakan siaran Logger .

Jika Anda ingin mendapatkan STDOUT dan pencatatan file untuk tugas rake dalam mode pengembangan, Anda dapat menambahkan kode ini ke 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

Uji

Berikut tugas Rake kecil untuk menguji kode di atas:

# 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

Menjalankan rake stdout_and_log:testkeluaran

HELLO FROM PUTS
HELLO FROM LOGGER

sementara

HELLO FROM LOGGER

telah ditambahkan ke log/development.log.

Menjalankan rake stdout_and_log:test RAILS_ENV=productionkeluaran

HELLO FROM PUTS

sementara

HELLO FROM LOGGER

telah ditambahkan ke log/production.log.

Eric Duminil
sumber
Di Rails 5, basename($0) == 'rake'trik tidak lagi berfungsi, karena railsperintah itu sendiri berjalan rake. Saya ingin menemukan pengganti yang baik untuk itu tergantung pada tugas yang mengatur broadcast. (Bagian itu, setidaknya, masih berfungsi dengan baik.)
Brent Royal-Gordon
@ BrentRoyal-Gordon Tidak perlu persyaratan ini dalam pengembangan, Anda cukup menambahkan kode ke Rakefileakar proyek Anda
Mauricio Pasquier Juan
4

Bagaimana dengan membuat aplikasi pembantu yang mendeteksi lingkungan mana yang sedang berjalan dan melakukan hal yang benar?

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

Kemudian panggil output_debug alih-alih put atau logger.info

naven87
sumber
5
Saya rasa ini bukan ide yang bagus. Logger Rails dimaksudkan agar dapat dikonfigurasi, tetapi alih-alih menggunakan konfigurasi itu, Anda hanya menumpuk lebih banyak lapisan di atasnya di sini.
Sijmen Mulder
Ya, itu bukan ide yang baik karena pemeriksaan yang sama akan dilakukan setiap kali Anda ingin mencatat sesuatu.
furiabhavesh
3

Di Rails 2.X untuk mengarahkan logger ke STDOUT dalam model:

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

Untuk mengarahkan logger di pengontrol:

ActionController::Base.logger = Logger.new(STDOUT)
Tania R
sumber
Saya juga menemukan artikel ini, sangat berguna sepcot.com/blog/2009/08/rails-logging-to-stdout
Tania R
2

Jalankan pekerjaan latar belakang dengan '&' dan buka skrip / konsol atau apa pun .. Dengan begitu Anda dapat menjalankan beberapa perintah di jendela yang sama.

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

catatan Bisa menjadi ceroboh dengan cepat ketika ada banyak keluaran logging.

Tom Maeckelberghe
sumber