Есть ли асинхронная библиотека регистрации для Ruby?

Синхронное ведение журнала требует большого штрафа за производительность, поскольку оно может блокироваться. Есть ли отдельная библиотека Ruby, которая выполняет асинхронное ведение журнала (log4r не похоже)? Могу ли я изменить стандартный логгер журнала для асинхронного ведения журнала? Я ищу что-то вроде log4j AsyncAppender - но предпочтительно реализация, которая использует блоки кода Ruby для перемещения как можно больше работы на задний план как можно.

Ответ 1

Я знаю, что вы не должны отвечать на свой вопрос, но в рубине все просто:

require 'thread'
require 'singleton'
require 'delegate'
require 'monitor'

class Async
  include Singleton

  def initialize
    @queue = Queue.new
    Thread.new { loop { @queue.pop.call } }
  end

  def run(&blk)
    @queue.push blk
  end
end

class Work < Delegator
  include MonitorMixin

  def initialize(&work)
    super work; @work, @done, @lock = work, false, new_cond
  end

  def calc
    synchronize {
      @result, @done = @work.call, true; 
      @lock.signal
    }
  end

  def __getobj__
    synchronize { @lock.wait_while { [email protected] } }
    @result
  end
end

Module.class.class_exec {
  def async(*method_names) 
    method_names.each do |method_name|
      original_method = instance_method(method_name)
      define_method(method_name) do |*args,&blk|
        work = Work.new { original_method.bind(self).call(*args,&blk) }
        Async.instance.run { work.calc }
        return work
      end
    end
  end
}

И для моего примера ведения журнала:

require 'Logger'
class Logger
  async :debug
end
log = Logger.new STDOUT
log.debug "heloo"

В качестве возвращаемых значений вы можете использовать это для всего:

require "test/unit"
class ReturnValues < Test::Unit::TestCase
  def do_it
    5 + 7
  end
  async :do_it
  def test_simple
    assert_equal 10, do_it - 2
  end
end

Ответ 2

Нет личного опыта с этим:

Swiftcore Analogger реализует быструю асинхронную систему ведения журнала для программ Ruby, а также для клиентской библиотеки для отправки сообщений регистрации к процессу Analogger.

Analogger будет принимать журналы из нескольких источников и может иметь несколько маршрутизации. В настоящее время входе в файл, в STDOUT или в Поддерживается STDERR. Будущая ревизия может поддерживать ведение журнала до пункт назначения базы данных.

Analogger зависит от EventMachine (http://rubyforge.org/projects/eventmachine) чтобы обеспечить основу для сетевых коммуникаций, хотя EM не используется для клиентской библиотеки.

Ответ 3

Встроенный класс Logger уже является потокобезопасным

Ответ 4

Оформление заказа Dunder https://github.com/fonsan/dunder

Я создал этот камень 6 месяцев назад, который делает именно это и многое другое