2011-12-18 151 views
5

這個腳本被命名爲o.rb爲什麼記錄器輸出到標準輸出重定向到文件?

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

當我使用./o.rb運行它,在控制檯上的輸出是正確的。我試過./o.rb > log.txt 2>&1,日誌文件是空的!
這是爲什麼發生?

我在使用簡單的puts函數時遇到同樣的問題。


UPDATE

這將重現此問題:

require 'logger' 

logger = Logger.new(STDOUT) 

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

當我運行它使用./foo.rb,它正確地寫入到控制檯輸出。

當我運行./foo.rb > log.txt時,我什麼也沒得到。

此外,當我使用./foo.rb | tee log.txt時,沒有任何內容寫入控制檯,並且日誌文件爲空。

log.txt文件已創建但保持爲空。

我的Ruby版本是1.8.7。

+0

適用於我... – sarnold 2011-12-18 02:43:36

+0

我的程序可能會持續運行一天,是否由於文件緩衝區沒有被刷新?剛纔我寫了一個簡單的腳本,只輸出一個句子和程序退出,它的工作原理。 – nttstar 2011-12-18 03:14:27

+0

我不認爲它是緩衝; ['LogDevice :: new'](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger/LogDevice.html#method-c-new)calls ['@dev .sync = true'](http://www.ruby-doc.org/core-1.9.3/IO.html#method-i-sync-3D) - 要求進行無緩衝操作。 – sarnold 2011-12-18 03:47:42

回答

11

這是一個緩衝問題,您可以設置標準輸出同步,這應該可以解決它。

#!/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

它的工作原理。但爲什麼輸出到控制檯沒有這個問題(沒有重定向)? – nttstar 2011-12-18 06:59:16

+1

不確定,當標準輸出不是tty時,Bash必須緩衝文件描述符。 – 2011-12-18 07:18:41

相關問題