Pousser ses logs Ruby dans Redis
- 01 Jun 2012 -

Il y a quelques mois j’ai réalisé un billet sur les avantages d’utiliser Logger avec Ruby plutôt que les méthodes « puts ».
Je présentais qu’il était aisément possible d’implémenter un « Logger Device » en mesure d’absorber les logs puis de les traiter par exemple en les injectant dans une base sqlite3.
Hier soir, j’ai réalisé un Gem facilitant ce travail dans le but de pousser les logs dans une Queue Redis.
Son utilisation est très simple. Il faut 1° mettre en place le device dans son code lors de la création du logger, puis dans un second temps coder un worker qui viendra régulièrement traiter les logs. Dès lors, il est possible de lancer différents workers en parallèle.
Pour l’installer, la procédure est classique:
$ gem install redis_logger_device
Code d’utilisation
require 'logger'
require 'redis_logger_device'
dev = RedisLoggerDevice::Base.new
logger = Logger.new(dev)
logger.info("AAAAAaaaaaahhhhh")
logger.close
Un simple Worker
Attention, ce code traite les logs de la queue redis mais exploite aussi un logger en STDOUT (worker_logger) qui n’a rien à voir avec le premier. A ne pas confondre :)
require 'logger'
require 'redis_logger_device'
include RedisLoggerDevice
class SimpleLogWorker < LogWorker
def process_queue!
loop do
begin
@logger.info("LogWorker fetching (#{@queue_name})...")
key, val = @redis.brpop @queue_name
@logger.info("LogWorker rocess key: #{key}; val: #{val}")
#your code : val = log entry
rescue SignalException => e
raise e
rescue Exception => e
@logger.fatal "LogWorker error: #{e.message}"
raise e
end
end
end
end
worker_logger = Logger.new(STDOUT)
worker = SimpleLogWorker.new(worker_logger)
worker.process_queue!
worker_looger.close
Ce Gem est fonctionnelle. Il exploite le mode ‘List’ de Redis. Je pense cependant apporter quelques améliorations rapidement, notamment en expoitant le mode PubSub.
