Si eres administrador de sistemas, y trabajas con Apache alguna vez habrás tenido que lidiar revisando los logs de Apache para encontrar algún tipo de entrada concreta, y revisar el fichero de texto tal cual puede ser algo tedioso por la cantidad de datos que aparecen. Por eso, tener los logs de Apache en color y decidir qué campos te interesa mostrar puede ser de gran ayuda, aquí te mostramos cómo hacerlo.

tail -f /var/log/apache2/access_log | apachelogs_colorize.py
Los campos que yo he elegido, pero que puedes cambiar a tu gusto son:
  • En blanco la fecha y hora de la petición
  • En azul la IP origen, excepto cuando es un bot que se indica con [bot]
  • El código de respuesta y el método (POST, GET), en verde para respuestas 2XX, en amarillo para 3XX y 4XXX y en rojo para 5XX
  • El tiempo de respuesta en milisegundos, en verde si está por debajo de 400ms, en amarillo si está entre 400ms y 750ms y en rojo si está por encima de 750ms
  • En blanco la URI de la petición
  • En azul el Referer si existe
  • Y por último el User Agent en morado

El formato de los logs en Apache es el estándar, combined salvo que al final hemos añadido el tiempo de respuesta de la petición. Por tanto, para incluir todos estos datos necesitarás definir un nuevo LogFormat que incluirá los mismos campos que el formato combined pero añadiéndole ese tiempo de respuesta al final. Y después, definir que los logs utilizarán ese formato con CustomLog:

<VirtualHost *:80>
   ...
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D" combined_response_time
    CustomLog /var/log/apache2/access_log combined_response_time
</VirtualHost>

Tras esto, recuerda recargar la configuración de Apache. Ya solo te queda este pequeño programita en python, que puedes retocar a tu gusto para elegir los colores que más te gusten, y pintar los campos que prefieras de los logs.

#!/usr/bin/python

# apachelogs_colorize.py

import sys, re
from termcolor import colored

# %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %D

e= re.compile(
    r"(?P<ip>[\d\.]+)\s"
    r"(?P<logname>\S*)\s"
    r"(?P<user>\S*)\s"
    r"\[(?P<datetime>.*?)\s"
    r"(?P<datetimeb>.*?)\]\s"
    r'"(?P<method>.*?)\s'
    r"(?P<path>.*?)\s"
    r'(?P<protocol>.*?)"\s'
    r"(?P<response_code>.*?)\s"
    r"(?P<response_size>.*?)\s"
    r'"(?P<referer>.*?)"\s'
    r'"(?P<user_agent>.*?)"\s'
    r"(?P<response_time>.*?)\s"
)

def print_req(req):
    print req['datetime'],

    if 'bot' in req['user_agent']:
        print colored('          [bot]', 'cyan'),
    else:
        print colored('{ip:>15}'.format(**req) , 'blue'),

    colors = {'2': 'green', '3': 'yellow', '4': 'yellow', '5': 'red'}
    color = colors[req['response_code'][0]]
    print colored("{response_code:<3} {method:<4}".format(**req), color),

    if 'response_time' in req and req['response_time']:
        ms = int(req['response_time']) / 1000
        color = 'green' if ms < 400 else ('yellow' if ms < 750 else 'red')
        print colored('{:>4}'.format(ms), color),
    else:
        print '    ',

    print req['path'],

    if req['referer'] != '-':
        print colored(req['referer'], 'cyan'),

    print colored(req['user_agent'], 'magenta'),
    print

while True:
    line = sys.stdin.readline()
    if line == '' :
            break
    if 'wp-admin' in line or 'wp-cron' in line:
            continue
    m = e.match(line)
    if not m:
        print colored('NOT MATCHED: ' + line, 'red')
        continue
    req = m.groupdict()
    print_req(req)

Este programa utiliza el módulo termcolor de python, si no lo tienes instalado deberás hacerlo de esta forma:

pip install termcolor

Referencias: Color Apache Logs

Por Byte

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.