为什么记录器输出到STDOUT不会被重定向到文件?

ntt*_*tar 6 ruby logging

此脚本命名为o.rb:

@logger = Logger.new(STDOUT)
@logger.info "start_time : #{start_time}"
Run Code Online (Sandbox Code Playgroud)

当我使用它时./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
Run Code Online (Sandbox Code Playgroud)

当我使用./foo.rb它运行时,它正确写入控制台输出.

当我跑步时./foo.rb > log.txt,我一无所获.

此外,当我使用时./foo.rb | tee log.txt,没有任何内容写入控制台,日志文件为空.

log.txt文件已创建但仍为空.

我的Ruby版本是1.8.7.

Jos*_*eek 13

这是一个缓冲问题,您可以将标准输出设置为同步,这应该解决它.

#!/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
Run Code Online (Sandbox Code Playgroud)