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