Существует ли библиотека асинхронного ведения журнала для Ruby? - PullRequest
12 голосов
/ 28 июня 2011

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

Ответы [ 4 ]

15 голосов
/ 30 июня 2011

Я знаю, что вы не должны отвечать на свой вопрос, но в ruby ​​кажется, что все просто:

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 { !@done } }
    @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 голосов
/ 28 июня 2011

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

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

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

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

1 голос
/ 02 июля 2011

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

0 голосов
/ 05 июля 2011

Оформить заказ Dunder https://github.com/fonsan/dunder

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...