Rails: Bir istisnanın tüm yığın izlemesini günlüğe kaydetme


110

Yığın izini kaydetmenin doğru yolunu bulmaya çalışıyorum. Logger.error $ !, $ !. backtrace'in gitmenin yolu olduğunu belirten bu bağlantıya rastladım , ancak bu benim için çalışmıyor log_error . Dokümantasyona göre, hata yöntemine ikinci bir argüman iletmenin nasıl işe yarayacağını anlamıyorum çünkü rayların kullandığı ruby ​​logger yalnızca tek bir argümanı kabul ediyor.

Garip bir şekilde (veya belki de değil) ikinci argüman herhangi bir tercüman şikayeti olmaksızın kabul edilir. Ancak ona ilettiğim her şey göz ardı ediliyor.

Neyi kaçırdığımı kimse açıklayabilir mi? Hataya yönelik ikinci argümanın ne için olduğu ve onu ne yediğine dair herhangi bir fikir var mı?

Yanıtlar:


204

ActiveSupport'ta BufferedLogger sınıfının kaynağına bakarsanız, ikinci bağımsız değişkenin 'progname' olduğunu görürsünüz. Bu, yalnızca ilk argüman sıfır olduğunda ve ona blok vermediyseniz veya blok gerçek olmayan bir değer döndürdüğünde kullanılır.

Aslında, ikinci parametreyi ek şeyler çıkarmak için kullanamazsınız.

Yapmak istediğiniz şey şuna daha benzer bir şey:

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

Günlük kaydı kurulumunuzu nasıl oluşturduğunuza bağlı olarak, geri izlemenin her satırını yinelemek ve belirli günlükleyicileri satırsonu çıktısı vermediğinden ayrı ayrı yazdırmak daha iyi olabilir, bu durumda aşağıdakilere benzer bir şey yaparsınız:

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

5
Platformlar arası uyumluluğu korumak için "\ r \ n" kullanarak katılırdım.
James Watkins

10
$/Bunun yerine, platformlar arası uyumlu olmak için kullanmaz mıydınız? \r\nSadece birkaç platforma özgü olduğu gibi , Ruby'nin bununla ilgilenmesine izin verin .
vgoff

12
Kaydediciyi birden çok kez çağırmak iş parçacığı güvenli olmadığından mesajınızı bölünmüş ve okunamaz hale getirebilirsiniz. Kaydedicinin kendisi iş parçacığı güvenlidir. Genellikle mesajımı bir dizede birleştirir ve ardından günlüğe kaydederim.
Morozov

O zamanlar logger, günlük girişlerinde yeni satırları desteklemiyor gibi görünüyordu, bu nedenle bölme ama evet, oldukça haklısınız ve bu yaklaşımın sınırlamalarının farkında olmalısınız
darkliquid

+1 @JackWatson kesinlikle garip cevap çünkü iş parçacığı güvenli değil. Bu önemli bir şey çünkü burada web uygulamalarından bahsediyoruz
EvAlex

16

İşte cevap.

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

9
daha az noktalama:Rails.logger.error [e.message, *e.backtrace].join($/)
artm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.