Is Ruby's stdlib Logger class thread-safe?

跟風遠走 提交于 2019-12-09 02:08:25

问题


In short, is the standard library Logger class in Ruby thread-safe? Only useful info Google turned up was someone on a forum saying it "seems" thread-safe. And I don't feel like spending time testing a logger to try to figure out if it is or not.

For the time being I'm using log4r which is thread-safe, but it's overkill if the standard library already does it.


回答1:


A quick look at logger.rb reveals code such as the following:

def write(message)
  @mutex.synchronize do
    if @shift_age and @dev.respond_to?(:stat)
      begin
        check_shift_log
      rescue
        raise Logger::ShiftingError.new("Shifting failed. #{$!}")
      end
    end
    @dev.write(message)
  end
end

So while I can't vouch for whether it gets thread-safety correct, I can confirm that it is making a concerted effort to do it right!

P.S. It's often easy to answer questions like this for yourself by reading the code :-)




回答2:


Below is my original response, which is actually wrong. Read Nemo157's comment below. I left it here for reference only.

Original:

I don't think it matters. All implementations of Ruby that I know of so far effectively run one thread at a time anyway: It does allow you to start many threads, but only one thread runs at a time per process.




回答3:


Some Ruby classes are designed to be thread safe, but don't explicitly say so in words of one syllable in their documentation. Unlike documentation in other programming languages such as PHP.

I remember being asked whether Queue was thread-safe on Stack Overflow, and even though it was, the documentation didn't spell that out.



来源:https://stackoverflow.com/questions/4660264/is-rubys-stdlib-logger-class-thread-safe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!