2017-09-03 6 views
0

ここで何が起こっているのか、何を尋ねるのかは分かりませんが、実際には例を書く必要がありました。TestClass#fooが期待どおりに動作しないのはなぜですか? (詳細と下の例)

期待される動作:

  1. test.startは、startメソッド内で呼び出された
  2. FOO {}バー
  3. バーは、ファイルたびにログインし、5秒ごとに呼び出され
  4. と呼ばれています。ポイント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

関連する問題