2017-09-03 38 views
0

我不確定這裏發生了什麼事情或者要問什麼,真的,所以我不得不寫一個例子。爲什麼TestClass#foo不按預期工作? (詳細信息和示例如下)

預期行爲:

  1. test.start稱爲
  2. FOO {欄}被稱爲啓動方法內
  3. 杆被稱爲每5秒,記錄每次的文件;它這樣做總共3次

一切正常,直到第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方法在實際代碼中並不重複,就像它在這裏一樣。

回答

1

這只是被緩衝的輸出。您可以強制輸出立即寫入,而不是使用IO#sync=進行緩衝。

例如:

STDOUT.reopen(@log_path, 'a') 
STDOUT.sync = true 
+0

非常感謝你。這解決了這個問題。 – voyager