September 23, 2013

80707

Haciendo un tail -f con formato

Cualquier desarrollador que trabaje con PHP, alguna vez se ha topado con el problema de hacer un debug de una variable. Sin embargo, imprimirlas en el navegador no siempre es la mejor opción, simplemente hay veces que no puedes como cuando trabajas con ajax o estás probando algo completamente del lado del servidor y no es viable hacer un var_dump de tu código a la mitad de tu controlador o modelo.

Bien, pues desde que trabajé hace ya un tiempo con RoR, me enamoré de tener una terminal abierta con las respuestas del sistema. Si bien en php no hay algo como tal, podemos hacer la next-best-thing

Configurando el entorno de trabajo

Dependiendo de tu instalación de PHP, debes tener un php_error.log en algún lugar de tu equipo de desarrollo, solo asegúrate de definir un lugar o el print_r no va a funcionar como es en el caso de OSX. En todo caso yo estoy usando MAMP y el log lo encuentro en /Applications/MAMP/logs/php_error.log.
Para mandar a llamar el log, hacemos un simple comando:
$ tail -f /path/para/tu/php_error.log

Como mandar a llamar el error log desde php

Desde cualquier parte de tu php, solo manda a llamar
error_log(print_r($variable,true));
Donde $variable puede ser lo que quieras debuggear. Puede ser un arreglo, un objeto o un string.

El resultado será algo así, dependiendo de lo que mandes a debuggear:

Tail Plain

PIMP my LOG

Ahora bien, si esto ya es una gran ayuda, siempre podemos darle un poco más de formato de colores para poder leer el log de una forma más sencilla.

Para esto hice un pequeño shell script con unos parámetros para darle Syntax highlighting.

#!/bin/bash

func (){
    local BLACK=`echo -en '\e[30m'`
    local RED=`echo -en '\e[31m'`
    local GREEN=`echo -en '\e[32m'`
    local YELLOW=`echo -en '\e[33m'`
    local BLUE=`echo -en '\e[34m'`
    local MAGENTA=`echo -en '\e[35m'`
    local CYAN=`echo -en '\e[36m'`
    local WHITE=`echo -en '\e[37m'`
    local RESET=`echo -en '\e[00m'`

    local GREP=""

    GREP="$GREP s/(\[|.*\])/$YELLOW\1$RESET/g;"
    GREP="$GREP s/(\[33m\[)(.*)(UTC\])/$MAGENTA\2$RESET/g;"
    GREP="$GREP s/(\(|\))/$BLUE\1$RESET/g;"
    GREP="$GREP s/(Array|stdClass Object)/$BLUE\1$RESET/g;"
    GREP="$GREP s/(=>)/$GREEN\1$RESET/g"

    tail -f /path/to/your/php_error.log | sed -E $GREP
}

func

Solo hace falta cambiarle el path para el log y darle permisos de ejecución.
$ chmod +x tail.sh
Una vez listo, simplemente lo corremos:
$ ./tail.sh

Y ahora nuestro log se verá así:

Tail Colored

No usé todos los colores definidos, pero los dejé por si quieren modificarlos.
Si encuentran algo para mejorar el script no duden en hacer un fork.

Esto es todo por ahora. Espero les sea de ayuda o ya de perdido el desarrollo les sea más leve.

Zero out!