Project

General

Profile

Actions

Bug #17203

closed

Logger::Formatter won't work with non main Ractor

Added by maciej.mensfeld (Maciej Mensfeld) over 3 years ago. Updated over 3 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 3.0.0preview1 (2020-09-25 master 0096d2b895) [x86_64-linux]
[ruby-core:100216]

Description

class Rogger < Ractor
  def self.new
    super do
      # STDOUT cannot be referenced but $stdout can
      logger = ::Logger.new($stdout)
 
      # Run the requested operations on our logger instance
      while data = recv
        logger.public_send(data[0], *data[1])
      end
    end
  end
  
  # Really cheap logger API :)
  def method_missing(m, *args, &_block)
    self << [m, *args]
  end
end
 
class Rails
  LOGGER = Rogger.new
 
  def self.logger
    LOGGER
  end
end
 
Ractor.new do
  Rails.logger.info "Hello"
end

running this ends up with:

terminated with exception (report_on_exception is true):
ruby/3.0.0/logger/formatter.rb:15:in `call': can not access global variables $$ from non-main Ractors (RuntimeError)
  from ruby/3.0.0/logger.rb:586:in `format_message'
  from ruby/3.0.0/logger.rb:476:in `add'
  from ruby/3.0.0/logger.rb:529:in `info'
  from test.rb:23:in `public_send'
  from test.rb:23:in `block in new'

however the same with fixed formatter works.

PR: https://github.com/ruby/ruby/pull/3600

All of the code examples are here: https://mensfeld.pl/2020/09/building-a-ractor-based-logger-that-will-work-with-non-ractor-compatible-code/

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0