ruby - 为什么 Logger 输出到 STDOUT 不会重定向到文件?

标签 ruby logging

这个脚本被命名为o.rb:

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

当我使用 ./o.rb 运行它时,控制台上的输出是正确的。
但是,当我尝试 ./o.rb > log.txt 2>&1 时,日志文件是空的!
为什么会这样?

我在使用简单的 puts 函数时遇到了同样的问题。


更新

这将重现此问题:

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。

最佳答案

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

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

关于ruby - 为什么 Logger 输出到 STDOUT 不会重定向到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8549443/

相关文章:

ruby - 如何获取 Sinatra 应用程序中的所有 URL 参数

python - 使用 pytest.ini 进行记录。如何附加到文件?

java - 无法使用 Log4j2 更改日志级别

Ruby Koans 计分项目

java - 是否可以将 "tail -f"命令的输出获取到 java 程序?

java - 如何正确关闭 log4j2

python - 如何使用 Python 在 Sqlite3 中记录查询?

ruby-on-rails - Ruby on Rails 的每个 do 方法。

c - 在 C 中嵌入 ruby​​ 代码

ruby - 如何替换模板占位符内的单词