什么是最快的Ruby logger实现?

什么是最快的Ruby logger实现?,ruby,comparison,benchmarking,logging,syslog,Ruby,Comparison,Benchmarking,Logging,Syslog,我想找到Ruby提供的最快的记录器。我的直觉告诉我syslog会在这场比赛中获胜。但我的直觉似乎是错的。Syslog是我测试过的三个记录器中速度最慢的。我使用的是MacBookPro、OSX10.6(雪豹)、Intel Core2 Duo、4GB内存和Ruby 1.8.7,这些都是用MacPorts构建的。我做错什么了吗?或者Ruby的syslog实现就是这么慢?如果你的结果与我的不同,请随意发布。还欢迎您将最喜欢的Ruby logger添加到基准测试中。我的目标是找到可用的最快的记录器。我只对

我想找到Ruby提供的最快的记录器。我的直觉告诉我syslog会在这场比赛中获胜。但我的直觉似乎是错的。Syslog是我测试过的三个记录器中速度最慢的。我使用的是MacBookPro、OSX10.6(雪豹)、Intel Core2 Duo、4GB内存和Ruby 1.8.7,这些都是用MacPorts构建的。我做错什么了吗?或者Ruby的syslog实现就是这么慢?如果你的结果与我的不同,请随意发布。还欢迎您将最喜欢的Ruby logger添加到基准测试中。我的目标是找到可用的最快的记录器。我只对纯性能(吞吐量)感兴趣。这里不关心多目标日志记录等功能

# loggers_bench.rb

require 'rbench'
require 'activesupport'
require 'syslog'
require 'logger'

buffered = ActiveSupport::BufferedLogger.new('buffered.log')
logger   = Logger.new('logger.log')
syslog   = Syslog.open('rb_syslog')

TIMES = 10_000

RBench.run(TIMES) do
  column :syslog,    :title => 'Syslog'
  column :logger,    :title => 'Logger'
  column :buffered,  :title => 'ActiveSuppoort::BufferedLogger'


  report '#info' do
    syslog {
      300.times do |i|
        syslog.info "hello #{i}"
      end
    }

    logger {
      300.times do |i|
        logger.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }
    buffered {
      300.times do |i|
        buffered.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }

  end
end

# > RUBYOPT=rubygems ruby loggers_bench.rb 
#                Syslog |  Logger | ActiveSuppoort::BufferedLogger|
# -----------------------------------------------------------------
# #info         158.316 | 117.882 |                        98.707 |
注意,我只对Syslog使用了更简单的形式:“hello#{I}”(理论上这应该更快,但事实并非如此)。另外,我的Mac的默认系统日志似乎有一个有限的消息配额(500/秒)。在系统日志中不时生成以下消息:

*** process 1962 exceeded 500 log message per second limit  -  remaining messages this second discarded ***

我猜
BufferedLogger
的名字的第一部分解释了它的速度,而其他两部分我希望在收到消息后立即编写消息

折衷的办法是提高缓冲对象的吞吐量,减少IO负载,避免因存储区中存在未刷新消息的大规模崩溃而导致日志信息丢失

我想知道,为了在不损失所有消息安全性的情况下提高吞吐量,并以增加复杂性为代价,是否有可能将这两种形式结合起来:使用缓冲日志记录有用但不必100.0000%完整的信息(即偶尔的小损失不会造成痛苦)对于出于法律或诊断目的而必须拥有的消息,您可以选择非缓冲消息


如果必须拥有的消息的数量相对较少(应该如此,或者这种方法可能不必要地复杂),那么使用哪种非缓冲记录器就无关紧要了。

尝试了syslog ng,结果如下:

次数:50次
用户系统总实际值
SYSLOG 0.0000000.0000000.000000(0.006187)
记录器0.0000000.010000 0.010000(0.003698)
缓冲0.0000000.0000000.000000(0.003069)


bufferred logger似乎更好。

好的,我更新了脚本以包含log4r,这是我的首选,因为它支持许多不同的功能。(滚动日志,耶!)

我还在缓冲记录器上添加了一个.flush,减少了测试时间,这样就不用花很长时间。log4r只比缓冲记录器稍微慢一点。那是我的选择

# loggers_bench.rb

require 'rbench'

require 'active_support'
require 'stringio'
buffered = ActiveSupport::BufferedLogger.new('buffered.log')
require 'logger'
logger   = Logger.new('logger.log')
require 'syslog'
syslog   = Syslog.open('rb_syslog')
require 'log4r'
log4r = Log4r::Logger.new 'mylog'
log4r.outputters = Log4r::FileOutputter.new('log', :filename => 'log4r.log')

TIMES = 5_000

RBench.run(TIMES) do
  column :syslog,    :title => 'Syslog'
  column :logger,    :title => 'Logger'
  column :buffered,  :title => 'ActiveSuppoort::BufferedLogger'
  column :log4r,     :title => 'log4r'


  report '#info' do
    syslog {
      10.times do |i|
        syslog.info "hello #{i}"
      end
    }

    logger {
      10.times do |i|
        logger.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }

    buffered {
      10.times do |i|
        buffered.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
      buffered.flush
    }

    log4r {
      10.times do |i|
        log4r.info "#{Time.now} logging_logger[Process.pid]:  INFO  logging_logger : hello #{i}"
      end
    }
  end
end
#                Syslog |  Logger | ActiveSuppoort::BufferedLogger |   log4r |
# ----------------------------------------------------------------------------
# #info           2.377 |   2.040 |                          1.425 |   1.532 |

您还应该查看日志记录(http://github.com/TwP/logging)框架。有一个基准(https://github.com/TwP/logging/blob/master/test/benchmark.rb)您可以查看该文件,以便与log4r和核心ruby记录器进行比较