rails rake görevlerine vs logger koyar


108

Rake görevinde puts komutunu kullanırsam, çıktıyı konsolda görüyorum. Ancak uygulama üretime dağıtıldığında günlük dosyasında bu mesajı görmeyeceğim.

Ancak Rails.logger.info dersem, geliştirme modunda konsolda hiçbir şey görmüyorum. Günlük dosyasına gitmem ve bunu takip etmem gerekiyor.

İdeal olarak Rails.logger.info'yu kullanmak istiyorum ve geliştirme modunda rake görevi içinde logger'dan gelen çıktı da konsola gönderilmelidir.

Bunu başarmanın bir yolu var mı?

Yanıtlar:


57

Bunu application.rbya da komisyon görevine koy kodu başlat

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

Bu Rails 3 kodudur. Bunun, oturum açmayı geçersiz kılacağını unutmayın development.log. Her ikisini de istiyorsanız STDOUTve development.logbir sarmalayıcı işlevine ihtiyacınız olacak.

Bu davranışı yalnızca Rails konsolunda istiyorsanız, aynı kod bloğunu ~/.irbrc.


26
Rails.logger = Logger.new(STDOUT)Development.rb'ye koymak daha kolay olmaz mıydı ?
ghempton

Raylar 2 için bunu geliştirmenize config.logger = Logger.new(STDOUT)
ekleyin.rb

38

Bunun işe yaraması için yeni bir tırmık görevi oluşturabilirsiniz.

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

Bu şekilde, komisyon görevinizi yürüttüğünüzde, stdout günlük mesajlarını almak için önce to_stdout ekleyebilir veya mesajların varsayılan günlük dosyasına gönderilmesini dahil etmeyebilirsiniz.

rake to_stdout some_task

11

Rake görevleri, bir kullanıcı tarafından komut satırında çalıştırılır. Hemen bilmeleri gereken her şey ("işlenmiş 5 satır") ile terminalde çıkarılmalıdır puts.

Gelecek dönem için saklanması gereken her şey ("jsmith@example.com'a uyarı e-postası gönderildi") adresine gönderilmelidir Rails.logger.


17
Cron ile komisyon görevlerini çalıştırmak alışılmadık bir durum değildir.
Johannes Gorset

2
Doğru. Günlük mesajlarının cron işi tamamlandığında size e-posta ile gönderilmesini istiyorsanız, bunları $ stdout veya $ stderr'e yazın.
Jonathan Julian

10

Kullanmanın Rails.logger.infogitmenin yolu olduğunu söyleyebilirim .

Sunucu üzerinden çalışmayacağı için sunucu konsolunda göremeyeceksiniz. Sadece yeni bir konsol ve tail -fgünlük dosyasını açın, hile yapacak.

Birçok kullanıcı, büyük bir dosyanın son birkaç satırını görüntülemek için kullanılabilen UNIX® 'tail' komutunun farkındadır. Bu, günlük dosyalarını vb. Görüntülemek için yararlı olabilir.

Bazı durumlarda daha da kullanışlı olan, 'kuyruk' komutunun '-f' parametresidir. Bu, tail'in dosyanın çıktısını 'izlemesine' neden olur. Başlangıçta yanıt kendi başına 'kuyruk' ile aynı olacaktır - dosyanın son birkaç satırı görüntülenecektir. Ancak komut, komut istemine geri dönmez ve bunun yerine dosyayı 'izlemeye' devam eder. Dosyaya ek satırlar eklendiğinde, bunlar terminalde görüntülenecektir. Bu, günlük dosyalarını veya zamanla eklenebilecek diğer dosyaları izlemek için çok kullanışlıdır. Bu ve diğer kuyruk seçenekleri hakkında daha fazla ayrıntı için 'adam kuyruğu' yazın.

( üzerinden )


Ancak, görevi çağırdığınız pencerede çıktıyı görmediğiniz için yerel makinede çalışırken çok rahat olmaz. Özellikle birden fazla pencereyi yan yana sığdıracak büyük bir ekranınız yoksa.
Tomas Markauskas

10
Daha da iyisi, tailf"Tail -f'ye benzer, ancak büyümediğinde dosyaya erişmez" (kılavuz sayfasından) kullanmaktır. Çok daha kısa
MBO

@tomas neden sunucu günlük konsolunu küçültmüyorsunuz ve sadece tail-f çalışırken tek bir konsol var? Her neyse bu gerçek bir sorun değil ... Uygulamamda neler olup bittiğini izleyen 8 konsol gibi çalışıyorum, sistemin belirli bir bölümünde çalışırken sekmeler arasında geçiş yapmak önemli değil
imho

@mbo nice :) halas makinemde mevcut gibi görünmüyor (mac os @ leopard)
marcgg

1
@marcgg: Bir "sunucu konsolum" yok (yolcuyu kullanıyorum), ancak soru komisyon görevleriyle ilgili ve bir görevi bir terminal penceresinden çalıştırırsanız, o pencerede kaydediciden hiçbir şey görmezsiniz. Çıktıyı görmek için development.log ile başka bir pencereniz olması gerekir. İdeal olarak, stdout'u bir şekilde Rails.logger'a başka bir çıkış akışı olarak eklerim, ancak orijinali kaldırmam.
Tomas Markauskas

9

kod

Rails 4 ve daha yenisi için Logger yayınını kullanabilirsiniz .

Geliştirme modunda komisyon görevleri için hem STDOUT hem de dosya günlüğü almak istiyorsanız, bu kodu şuraya ekleyebilirsiniz 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

Ölçek

Yukarıdaki kodu test etmek için küçük bir Rake görevi:

# 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Çıkışları çalıştırma

HELLO FROM PUTS
HELLO FROM LOGGER

süre

HELLO FROM LOGGER

eklendi log/development.log.

rake stdout_and_log:test RAILS_ENV=productionÇıkışları çalıştırma

HELLO FROM PUTS

süre

HELLO FROM LOGGER

eklendi log/production.log.


Rails 5'te, basename($0) == 'rake'hile artık çalışmıyor çünkü railskomutun kendisi çalışıyor rake. .Tml'i kuran göreve bağlı olarak bunun için iyi bir yedek bulmayı çok isterim broadcast. (En azından bu kısım hala iyi çalışıyor.)
Brent Royal-Gordon

@ BrentRoyal-Gordon Geliştirmede bu şarta gerek yok, kodu Rakefileprojenizin köküne ekleyebilirsiniz
Mauricio Pasquier Juan

4

Hangi ortamın çalıştığını algılayan ve doğru şeyi yapan bir uygulama yardımcısı oluşturmaya ne dersiniz?

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

Ardından puts veya logger.info yerine output_debug çağırın


5
Bunun iyi bir fikir olduğunu sanmıyorum. Rails kaydedicinin yapılandırılabilir olması amaçlanmıştır, ancak bu yapılandırılabilirliği kullanmak yerine, sadece bunun üzerine daha fazla katman yığarsınız.
Sijmen Mulder

Evet, her kayıt istediğinizde aynı kontrol yapılacağından bu iyi bir fikir değildir .
furiabhavesh

3

Modellerde logger'ı STDOUT'a yönlendirmek için Rails 2.X'te:

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

Günlükçüyü denetleyicilerde yeniden yönlendirmek için:

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

Bu makaleyi de çok yararlı buldum
Tania R

2

Bir arka plan işini '&' ile yürütün ve komut dosyası / konsol veya her neyse açın .. Bu şekilde aynı pencerede birden fazla komut çalıştırabilirsiniz.

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

note Not Çok sayıda günlük kaydı çıktığında hızla özensizleşebilir.

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.