什么是最快的Ruby记录器实现?

时间:2009-09-09 07:38:22

标签: ruby comparison benchmarking logging syslog

我想找到Ruby提供的最快的记录器。我的直觉告诉我,系统日志会赢得这场比赛。但我的直觉似乎是错误的。 Syslog是我测试的三个记录器中最慢的。我正在使用我的MacBook Pro,OSX 10.6(Snow Leopard),Intel Core2 Duo,4GB内存和MacPorts构建的Ruby 1.8.7。难道我做错了什么?或者Ruby的syslog实现那么慢?如果他们与我的不同,请随意发布您的结果。您也可以将您喜欢的Ruby记录器添加到基准测试中。我的目标是找到最快的记录器。我只对纯粹的性能(吞吐量)感兴趣。这里不关心多目标日志记录等功能。

# 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 |

请注意,我只使用了更简单的形式:“hello#{i}”用于Syslog(理论上这应该更快,但事实并非如此)。此外,我的Mac的默认syslogd似乎有一个有限的消息配额(500 /秒)。系统日志中不时生成以下消息:

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

4 个答案:

答案 0 :(得分:2)

我猜测BufferedLogger的名字的第一部分解释了它的速度,与其他两个相比,我希望它们在收到后立即写信息。

权衡将是缓冲对象的吞吐量提高,其IO负载减少,以及因存储中未刷新的消息导致批发崩溃而导致的日志信息丢失。

我想知道,为了在不丢失所有消息安全性的情况下提高吞吐量并且以增加复杂性为代价,可以将这两种形式结合使用:使用缓冲记录器获取有用但不必100.0000%完成的信息(即偶然的小损失不会造成痛苦)和非缓冲的一种你选择的消息,你只是必须拥有,出于法律或诊断的目的,比如说。

如果必备消息的数量相对较低(并且它应该是或者这种方法可能不必要地复杂),那么您使用的非缓冲记录器并不重要。< / p>

答案 1 :(得分:2)

好的,我更新了脚本以包含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 |

答案 2 :(得分:0)

尝试使用syslog-ng,结果如下:

时间:50
      用户系统总实际
SYSLOG 0.000000 0.000000 0.000000(0.006187)
LOGGER 0.000000 0.010000 0.010000(0.003698)
BUFFERED 0.000000 0.000000 0.000000(0.003069)

bufferred logger似乎更好。

答案 3 :(得分:0)

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