我使用的是标准的Ruby2.2记录器(即不是来自Rails的记录器),由于我想使用它作为旋转记录器,所以我用shift-age和shift-time调用它,并向它传递一个文件名,而不是一个打开的文件句柄,如下所示:

Logger.new('my_file.log', 4, 100_000)

我想使这个记录器的输出没有缓冲,但我没有在logger接口中找到任何允许这样做的方法。
在我使用这个记录器的特定方式中(我用我自己的类包装这个记录器,这个类做定制),我的代码中有一个中心点,每个日志请求都要经过这个中心点,所以如果我可以得到底层的IO对象,我可以在这一点上进行同步,但我也不知道如何找到这个IO对象。
有什么想法吗?

最佳答案

您不需要设置sync。它已经由Logger在创建日志文件时设置:

def create_logfile(filename)
  begin
    logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
    logdev.flock(File::LOCK_EX)
    logdev.sync = true
    add_log_header(logdev)
    logdev.flock(File::LOCK_UN)
  rescue Errno::EEXIST
    # file is created by another process
    logdev = open_logfile(filename)
    logdev.sync = true
  end
  logdev
end

资料来源:
https://github.com/ruby/ruby/blob/trunk/lib/logger.rb

10-05 18:23