Logstash filter para PHP errors

logstash-logoLas aplicaciones tienen errores, algunos mas graves otros menos graves. Algunos mas visibles, otros irreproducibles. Los distintos lenguajes y servidores de aplicación hacen logs de los errores que se encuentran. Pero seamos sinceros, a menos que nos llamen para decirnos de que algo anda mal, el 90% de las veces no nos entereamos y probablemente ni nos interese (hay cosas mas divertidas para hacer que casar bugs).

Para ser un poco mas pro activo en la búsqueda de problemas, o para hacernos la vida un poco mas facil a la hora de buscar la causa del error cuando ya no nos lo reportaron, es necesario revisar los logs de la aplicación. Pero es un dolor de cabeza!!!

Por todo esto estoy trabajando un poco para poner en funcionamiento una instancia del stack ELK (intentando sin exito hacer algunos dashboards útiles) y no pude encontrar un parsing decente de los logs de Apache para los errores PHP, y así tener datos mas útiles sobre los errores, por lo que arme uno propio.

Aquí lo comparto en un gist la configuración que arme (próximamente mas info).


filter {
if [type] == "apache_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
}
filter {
if [type] == "apache_error" {
grok {
match => { "message" => "\[%{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}\] \[:%{LOGLEVEL:loglevel}\] \[pid %{POSINT:pid}\]( \(%{POSINT:proxy_errorcode}\)%{DATA:proxy_errormessage}:)?( \[client %{IPORHOST:client}:%{POSINT:clientport}\])? PHP %{DATA:php_error_level}: %{DATA:php_error} in %{DATA:php_file} on line %{POSINT:php_line}" }
}
grok {
match => { "message" => "\[%{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}\] \[:%{LOGLEVEL:loglevel}\] \[pid %{POSINT:pid}\]( \(%{POSINT:proxy_errorcode}\)%{DATA:proxy_errormessage}:)?( \[client %{IPORHOST:client}:%{POSINT:clientport}\])? %{GREEDYDATA:message}" }
}
}
}

Con este parseo de los logs, pude lograr sacar datos especificos del error php:

Selección_033

Y este es mi primera versión del dashboard.

Selección_032

Perdón por ofuscar tanto, pero uno nunca sabe cuando está exponiendo información que no debe.

Probablemente lo mas útil es para tener mas información de errores que ocurren en producción ya que nos dice la cantidad de apariciones del mismo error (php_error), severidad (php_error_level), en que servidor (host), archivo (php_file) y linea (php_line) donde esta el error.

Deja un comentario