Ruby的stdlib Logger类是线程安全的吗?

时间:2011-01-11 16:59:33

标签: ruby multithreading logging thread-safety log4r

简而言之,Ruby中的标准库Logger类是否是线程安全的?只有谷歌出现的有用信息才是论坛上有人说它“似乎”是线程安全的。而且我不想花时间测试记录器来试图判断它是否存在。

目前我正在使用线程安全的log4r,但如果标准库已经这样做,那就太过分了。

4 个答案:

答案 0 :(得分:46)

快速查看logger.rb会显示如下代码:

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

因此,虽然我无法保证它是否具有线程安全性正确,但我可以确认它正在齐心协力做正确的事情!

P.S。通过阅读代码,通常很容易回答这样的问题: - )

答案 1 :(得分:0)

以下是我原来的回复,实际上是错误。阅读下面的Nemo157评论。我把它留在这里仅供参考。

<强>原始

我认为这不重要。到目前为止,我所知道的Ruby的所有实现都有效地一次运行一个线程:它允许你启动许多线程,但每个进程一次只运行一个线程。

答案 2 :(得分:0)

某些Ruby类被设计为线程安全的,但是在文档中的一个音节的单词中没有明确说明。与其他编程语言(如PHP)中的文档不同。

我记得当被问到Queue是否在Stack Overflow上是线程安全的时候,即使它是,但文档并没有拼写出来。

答案 3 :(得分:0)

source

尝试将日志混入多线程中

require 'logger'
require 'parallel'

logger = Logger.new("/tmp/test.log")

Parallel.map(['a','b'], :in_threads => 2) do |letter|
  1000.times do
    logger.info letter * 5000
  end
end

测试日志文件

egrep -e 'ab' -e 'ba' /tmp/test.log
[empty]

未混合日志的原因:

def write(message)
  @mutex.synchronize do
    ...    
    @dev.write(message)        
  end
end