Rails: Mencatat seluruh jejak tumpukan pengecualian


110

Saya telah mencoba mencari cara yang tepat untuk mencatat jejak tumpukan. Saya menemukan tautan ini yang menyatakan bahwa logger.error $ !, $ !. backtrace adalah cara yang tepat tetapi itu tidak berhasil bagi saya log_error tidak. Sesuai dokumentasi, saya tidak melihat bagaimana meneruskan argumen kedua ke metode kesalahan akan tetap berfungsi karena ruby ​​logger yang digunakan rails hanya menerima satu argumen.

Anehnya (atau mungkin tidak) argumen kedua diterima tanpa ada keluhan juru bahasa. Namun apapun yang saya berikan padanya diabaikan.

Adakah yang bisa menjelaskan apa yang saya lewatkan? Adakah wawasan tentang untuk apa argumen kedua kesalahan itu dan untuk apa memakannya?

Jawaban:


204

Jika Anda melihat sumber kelas BufferedLogger di ActiveSupport, Anda akan melihat bahwa argumen kedua adalah 'progname'. Ini digunakan hanya jika argumen pertama adalah nil dan Anda tidak memberikannya blok atau blok mengembalikan nilai yang tidak benar.

Intinya, Anda tidak dapat menggunakan parameter kedua untuk menghasilkan barang tambahan.

Yang ingin Anda lakukan adalah sesuatu yang lebih mirip dengan:

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

Bergantung pada bagaimana Anda memiliki pengaturan logging Anda, mungkin lebih baik untuk mengulang melalui setiap baris backtrace dan mencetaknya secara terpisah karena logger tertentu tidak mengeluarkan baris baru, dalam hal ini Anda akan melakukan sesuatu seperti:

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end

5
Saya akan bergabung menggunakan "\ r \ n" untuk menjaga kompatibilitas lintas platform.
James Watkins

10
Bukankah Anda akan menggunakan $/sebagai gantinya, agar kompatibel dengan lintas platform? Biarkan Ruby yang mengurusnya, karena \r\nhanya spesifik untuk beberapa platform.
vgoff

12
Anda mungkin mendapatkan pesan Anda terpisah dan tidak terbaca karena memanggil logger beberapa kali tidak aman untuk thread. Sedangkan logger sendiri adalah thread safe. Biasanya saya menggabungkan pesan saya dalam satu string lalu mencatatnya.
Morozov

Pada saat logger tampaknya tidak mendukung baris baru dalam entri log, maka pemisahannya tetapi ya, Anda benar dan Anda harus menyadari batasan pendekatan ini
darkliquid

+1 @JackWatson jawaban yang benar-benar aneh karena aman tanpa utas. Ini penting karena kita berbicara tentang aplikasi web di sini
EvAlex

16

Inilah jawabannya.

begin
  raise
rescue => e
  logger.error ([e.message]+e.backtrace).join($/)
end

9
lebih sedikit tanda baca:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.