Home Contact Download

asyd.net

Welcome to Bruno Bonfils's (aka asyd homepage).

log4r

log4r est une bibliothèque de gestion de logs pour ruby (à la log4j, etc). Son utilisation est beaucoup plus souple que celle de logger qui ne permet pas, par exemple, de (re)définir simplement le format des logs, seul le format de date étant paramétrable. La configuration de log4r, à l'instar de celle de log4j, peut être effectuée via un fichier XML. Ce qui a l'avantage considérable d'externaliser la configuration des logs par rapport au code ruby proprement dis.

Voyons un petit exemple :

#!/usr/bin/ruby
 
require 'log4r'
require 'log4r/configurator'
include Log4r
 
class MyFormatter < BasicFormatter
    @@basicformat = "%s:%s %*s %s"
 
    def format(event)
      if (ENV.has_key?('REMOTE_USER'))
         user = ENV['REMOTE_USER']
      else
         user = "anonymous"
      end
 
      if (ENV.has_key?('REMOTE_ADDR'))
         address = ENV['REMOTE_ADDR']
      else
         address = 'unknow'
      end
 
      buff = sprintf(@@basicformat, user, address, MaxLevelLength, LNAMES[event.level],
             event.name)
      buff += (event.tracer.nil? ? "" : "(#{event.tracer[0]})") + ": "
      buff += format_object(event.data) + "\n"
      buff
    end
end
 
Configurator.load_xml_file('./log4r.xml')
 
logger = Logger['logger']
logger.level = Logger::WARN
logger.debug { "debug message" }
logger.info { "info message" }
logger.warn { "warn message" }
logger.error { "error message" }
logger.fatal { "fatal error" }

La classe MyFormatter (qui hérite de BasicFormatter) permet de définir mon propre format de logs. Dans cet exemple, le script étant voué à une utilisation en CGI authentifié, cela me permet de rajouter le nom d'utilisateur ainsi que son IP à chaque fichier de log.

<log4r_config>
   <pre_config>
      <global level="DEBUG" />
      <parameter name="webservices_log" value="webservices.log" />
   </pre_config>
 
   <outputter type="FileOutputter" name="radius">
      <filename>#{webservices_log}</filename>
      <trunc>false</trunc>
      <formatter type="MyFormatter" />
   </outputter>
 
   <logger name="logger" level="DEBUG" outputters="radius" />
</log4r_config>