【问题标题】:Causing the Ruby Logger to autoflush导致 Ruby Logger 自动刷新
【发布时间】:2015-08-12 11:26:50
【问题描述】:

我使用的是标准的 Ruby 2.2 记录器(即不是 Rails 的记录器),因为我想将它用作旋转记录器,所以我用 shift_age 和 shift_time 调用它,并将文件名传递给它,而不是打开的文件句柄,像这样:

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

我想让这个记录器的输出不带缓冲,但我在记录器接口中没有找到任何允许这样做的方法。

在我使用这个记录器的特定方式中(我用我自己的类包装记录器,它进行自定义),我的代码中有一个中心点,每个记录请求都通过,所以如果我能得到底层 IO 对象,此时我可以进行同步,但我也不知道如何找到这个 IO 对象。

有什么想法吗?

【问题讨论】:

  • 无缓冲是什么意思?例如,任何时候你写logger.info,输出都会立即出现在日志文件中。
  • 请问,这是在哪里记录的?我在文档中没有发现任何提及 Logger 会在其 IO 句柄上将同步设置为 true 的事实,但是当我搜索该主题时,我发现在各种论坛讨论中提到 Logger 输出不会 i> 被自动刷新(但是我也没有找到任何有用的解决方案)。或许我得深入研究一下Logger的源码才能得到权威的答案……

标签: ruby logging


【解决方案1】:

您不需要设置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

【讨论】:

  • 我最后都想要print logs in the terminalcreate a log file。我该怎么做?
  • @paul 如果你想同时做这两个,看起来这里有一些解决方案:stackoverflow.com/questions/6407141/…
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2012-10-13
  • 2016-05-11
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多