Search code examples
rubymultithreadingloggingthread-safetylog4r

Is Ruby's stdlib Logger class thread-safe?


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.


Solution

  • 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 :-)