5. Bitácoras

WEBrick utiliza una bitácora para registrar su actividad. Esta bitácora del servidor se pone a su vez a disposición de todos los servlets. Por favor, utilizarla para registrar la actividad del servlet en vez de lanzar apunte tras apunte, por ejemplo a $stderr.

La bitácora tiene cinco niveles diferentes de apuntes y un nivel por defecto. Cada nivel tiene su propia prioridad y los apuntes se realizan si el apunte tiene un nivel igual o superior al nivel por defecto.

Los niveles son los siguientes (organizados de mayor a menor prioridad):

Se puede registrar el apunte de un mensaje llamando a la bitácora como sigue:

@logger.error("1+1 es 3? debes haber cometido algún error")

También es posible utilizar el método << que siempre realiza un apunte bajo el nivel "info"

@logger << "Este es un apunte informativo"

La bitácora viene con un nivel "info" por defecto y la salida va a $stderr, pero se puede modificar este comportamiento muy sencillamente como sigue:

    class HelloWorldServlet < HTTPServlet::AbstractServlet
      def do_GET( req, res )
	@logger.debug( "Vamos a devolver 'Hola mundo'" )
	res.body= 'Hola mundo'
      end
    end

    #Ahora definimos una bitácora que la salida va a /dev/null
    # y tiene un nivel por defecto de 'INFO'
    null_logger= Log.new( '/dev/null' )

    #Esta es una bitácora que la salida va a $stderr
    # y tiene un nivel por defecto de 'DEBUG'
    fatal_error_logger= Log.new( $stderr, Log::DEBUG )

    start_webrick( :Logger=> fatal_stderr_logger ) do |server|
	server.mount( '/helloworld', HelloWorldServlet )
    end
  

5.1. Bitácora de accesos

La bitácora de accesos es especial: probablemente se acceda a ella con más frecuencia que a otras. Por lo tanto, puede que no se quiera hacer nada especial para sacarla del mecanismo general de apuntes. Así, WEBrick no mezcla la bitácora de accesos con otras bitácoras.

Bien, de hecho, la bitácora de acceso y la del servidor, por defecto, realizan la salida sobre el mismo sumidero: $stderr. Vamos a cambiar este comportamiento en el siguiente ejemplo.


    server_logger= Log.new('/var/log/webrick/server.log')

    # La configuración de :accessLog necesita un Array.
    # cada elemento del array debe ser un array de dos 
    # elementos donde el primero es un stream ( o cualquier
    # objeto que responda a << ) y el segundo es el
    # formato de los apuntes. En webrick/accesslog.rb están
    # los diferentes formatos disponibles.

    access_log_stream=
      File.open('/var/log/webrick/access.log','w')
    access_log= [[access_log_stream, AccessLog::COMBINED_LOG_FORMAT]]

    start_webrick(
	:Logger=> server_logger,
	:AccessLog=> access_log
    )