Rubyが提供する最速のロガーを見つけたいです。私の直感によると、このレースではsyslogが勝つでしょう。しかし、私の直感は間違っているようです。Syslogは、私がテストした3つのロガーの中で最も遅いことがわかりました。MacBook Pro、OSX 10.6(Snow Leopard)、Intel Core2 Duo、4GBのRAM、MacPortsから構築されたRuby1.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 |
Syslogには「hello#{i}」という単純な形式しか使用していないことに注意してください(理論的にはこれはさらに高速になるはずですが、そうではありません)。また、私のMacのデフォルトのsyslogdには、制限されたメッセージクォータ(500 /秒)があるようです。次のメッセージがsyslogで時々生成されます。
*** process 1962 exceeded 500 log message per second limit - remaining messages this second discarded ***