2011-12-18 22 views
5

Bu komut dosyası o.rb adlandırılır: Ben ./o.rb kullanarak çalıştırdığınızdaNeden Logger çıkışı STDOUT'a dosyalara yönlendiriliyor?

@logger = Logger.new(STDOUT) 
@logger.info "start_time : #{start_time}" 

, konsolda çıktı doğrudur.
Ancak, ./o.rb > log.txt 2>&1'u denediğimde, günlük dosyası boş!
Bu neden oldu?

Basit puts işlevini kullanırken aynı sorunu yaşıyorum. Bu, bu sorunu yeniden edecek


GÜNCELLEME:

require 'logger' 

logger = Logger.new(STDOUT) 

loop do 
    logger.info "This is a test haha" 
    sleep(1) 
end 

Ben ./foo.rb kullanarak çalıştırmak, bu konsol çıkışa doğru yazar.

./foo.rb > log.txt'u çalıştırdığımda hiçbir şey alamıyorum.

Ayrıca, ./foo.rb | tee log.txt'u kullandığımda, konsola hiçbir şey yazılmaz ve günlük dosyası boş.

Log.txt dosyası oluşturuldu ancak boş bırakıldı.

Ruby sürümüm 1.8.7'dir.

+0

İşleri ... – sarnold

+0

Programım irade 1 gün belki çalışan, bu değil boşaltılan dosya tampon kaynaklanır tutar? Sadece şimdi sadece bir cümle ve program çıktısını veren basit bir betik yazdım, işe yarıyor. – nttstar

+0

Sanırım arabelleğe almıyor; ['LogDevice :: new'] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new) [' @dev çağırır .sync = true'] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - arabelleğe alınmamış işlemi sorar. – sarnold

cevap

11

Bu bir arabellek sorunudur, standart çıkışı senkronize olarak ayarlayabilirsiniz ve bu sorunu çözer. Benim için

#!/usr/bin/env ruby 

require 'logger' 

$stdout.sync = true 
logger = Logger.new($stdout) 

loop do 
    logger.info "This is a test haha" 
    sleep 1 
end 
+0

çalışır. ancak konsola çıkış yapmak neden bu soruna sahip değil (yönlendirmeden)? – nttstar

+1

Emin değil, Bash standart çıktı tty değilse, dosya tanıtıcı arabellek gerekir. –