2012-08-02 20 views
42

Başlık ile aynı: rspec'i çalıştırırken konsol/stdout için Rails.logger yazdırma nasıl yapılır? Örneğin. Rails.logger rspec çalışırken konsola/stdout'a nasıl yazdırılır?

Rails.logger.info "I WANT this to go to console/stdout when rspec is running" 
puts "Like how the puts function works" 

Hala Rails.logger çok log/test.log gitmek istiyorum.

Sen Rails.logger.info ve koyar hem bir mesaj gönderir spec_helper.rb bir yöntemi tanımlamak ve hata ayıklama için kullanabiliriz

cevap

44

, config/environments/test.rb bir logger yapılandırmak Raylar 3.x için this answer.

bkz:

config.logger = Logger.new(STDOUT) 
config.logger.level = Logger::ERROR 

Bu kaydedilir hataları serpiştirmek olacak STDOUT test sırasında . Çıkışı STDERR'ye yönlendirmek veya bunun yerine farklı bir günlük seviyesi kullanmak isteyebilirsiniz.

Bu iletileri hem konsol hem de günlük dosyasına göndermek, Ruby'nin yerleşik Logger sınıfından daha sağlam bir şey gerektirir. logging gem istediğini yapacak. Sonra config/environments/test.rb iki appenders kurmak, senin Gemfile bunu ekleyin: Raylar için

logger = Logging.logger['test'] 
logger.add_appenders(
    Logging.appenders.stdout, 
    Logging.appenders.file('example.log') 
) 
logger.level = :info 
config.logger = logger 
+0

Raylar için 4.2.1, logger örneğinde 'bootstrap.rb' dosyasında üzerine yazıldığından, log düzeyini yapılandırmada ayarlamak zorunda kaldım: https://github.com/rails/rails/blob/v4. 2.4/railtiler/lib/raylar/application/bootstrap.rb # L70 Günlük seviyesi şu şekilde ayarlandı: 'config.log_level =: ERROR' – tommes

+0

@tommes Eklediğiniz tam dosya adı ve kodu ile başka bir cevap yazabilir misiniz? Rails 3.x için belirtmek için cevabımı değiştireceğim. –

+0

tamamlandı! http://stackoverflow.com/a/32628272/1308089 – tommes

7

:

def log_test(message) 
    Rails.logger.info(message) 
    puts message 
end 
+1

ben vb Rails.logger.info, Rails.logger.debug, kullandıkları için ben Rails.logger.info çağırarak harici bir şey için umuyordum benim üretim kodu Yine de cevapladığın için teşekkürler. – s12chung

+0

Görüyorum. Ama bu neden testlerde Rails.logger'ı kullanmanı engelliyor? – manglewood

+0

Testlerimde de kullanıyorum. Kuyruğu kullanmak yerine herşeyi stdout'a yazdırmak güzel olurdu. – s12chung

18

o RSpec tutar, çünkü ister bir çözüm Eğer yanı sıra üzerinde RSpec çalıştırdığınız ana terminali hem görebileceği şekilde

  • açın ikinci terminal penceresi veya sekme ve bunu düzenlemek: çıktı fiili raylar ayrı, çıkış oturum şunları yapmaktır yeni bir tane.
  • İkinci pencerede bir kuyruk komutu çalıştırın, böylece raylar test ortamında oturum açtığınızı görürsünüz. Varsayılan olarak bu
  • Run sizin RSpec suit

Eğer iTerm gibi çok camlı terminali çalıştırıyorsanız Pencere kullanıcıları için $ tail -f $RAILS_APP_DIR/logs/test.log veya tail -f $RAILS_APP_DIR\logs\test.log gibi olabilir, bu daha eğlenceli hale gelir ve siz rspec varsa ve test.log çıktı yan yana.

26

Günlüğü background job (&) olarak doldurun ve rspec çıktısıyla araya girecektir. Raylar 4 için

tail -f log/test.log & 
bundle exec rspec 
+4

Bu temiz bir çözümdür. – Gal

44

günlük düzeyi daha farklı biraz yapılandırıldığı 4.x Raylar 3.Eğer üzerine yazılmasını izin verebilir bir bonus olarak değişken https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

Çevre

: x

config/environment/test.rb

# Enable stdout logger 
config.logger = Logger.new(STDOUT) 

# Set log level 
config.log_level = :ERROR 

logger düzeyinde config.log_level gelen logger örneğinde ayarlandığında Bu ekle

gibi bir varsayılan değere sahip bir ortam değişkeni kullanarak günlük düzeyi kabuğundan
# default :ERROR 
config.log_level = ENV.fetch("LOG_LEVEL", "ERROR") 

Sonra çalışan testler:

# Log level :INFO (the value is uppercased in bootstrap.rb) 
$ LOG_LEVEL=info rake test 

# Log level :ERROR 
$ rake test