首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有Ruby的异步日志库?

有没有Ruby的异步日志库?
EN

Stack Overflow用户
提问于 2011-06-28 06:24:20
回答 4查看 4.5K关注 0票数 13

同步日志记录会导致很大的性能损失,因为它可能会阻塞。有没有一个独立的Ruby库可以做异步日志记录(log4r似乎没有)?我可以修改标准库记录器来异步记录吗?我正在寻找类似log4jRuby的AsyncAppender --但最好是能利用Ruby的代码块将尽可能多的工作转移到后台线程的实现。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-30 04:53:38

我知道你不应该真的回答你自己的问题,但似乎在ruby中一切都很容易:

代码语言:javascript
复制
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
}

对于我的日志记录示例:

代码语言:javascript
复制
require 'Logger'
class Logger
  async :debug
end
log = Logger.new STDOUT
log.debug "heloo"

当返回值工作时,您可以将其用于任何事情:

代码语言:javascript
复制
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
票数 15
EN

Stack Overflow用户

发布于 2011-06-28 06:31:44

对此没有个人经验:

Swiftcore Analogger实现了一个用于

程序的快速异步日志记录系统,以及用于向Analogger进程发送日志消息的客户端库。

Analogger将接受来自多个来源的日志,并且可以有多个日志记录目的地。目前,支持记录到文件、STDOUT或STDERR。将来的版本也可能支持记录到数据库目标。

Analogger依赖于EventMachine (http://rubyforge.org/projects/eventmachine)来提供网络通信的框架,尽管EM不用于客户端库。

票数 2
EN

Stack Overflow用户

发布于 2011-07-03 01:26:44

内置的Logger类已经是线程安全的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6499654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档