我不确定这里发生了什么或者要问什么,真的,所以我不得不写一个例子。
预期行为:
一切正常,直到第3点。查看时间戳,foo.bar似乎每5秒调用一次,但在循环终止之前它不会输出到文件。实际上,它在15秒后连续3次登录到文件。
require 'logger'
module Logging
def logger
Logging.logger
end
def self.logger
@logger ||= Logger.new(STDOUT)
end
end
class TestClass
include Logging
def initialize delay, log_path
@delay = delay
@log_path = log_path
end
def start
File.delete @log_path if File.exist? @log_path
exit if fork
Process.setsid
exit if fork
Dir.chdir '/'
STDOUT.reopen(@log_path, 'a')
STDERR.reopen(@log_path, 'a')
foo { bar }
end
def foo &block
3.times do
yield
sleep @delay
end
end
def bar
logger.info(self.class.name) { "testing" }
end
end
test = TestClass.new(5, "#{Dir.pwd}/test.log")
test.start
谁能告诉我这里我做错了什么? foo方法在实际代码中并不像在这里那样多余。
答案 0 :(得分:1)
这只是缓冲的输出。您可以强制输出写入immediatley而不是使用IO#sync=
进行缓冲。
例如:
STDOUT.reopen(@log_path, 'a')
STDOUT.sync = true