En este tutorial investigamos la herramienta Logstash, de Elastic, para administrar nuestros logs.
0. Índice de contenidos
- 1. Introducción
- 2. Entorno
- 3. Logstash
- 4. Instalación y ejemplo sencillo
- 5. Algo más avanzado
- 6. Conclusiones
- 7. Referencias
1. Introducción
Logstash es una herramienta desarrollada por Elastic y que funciona bajo la JVM de Java. Ésta nos permite administrar los logs de nuestras aplicaciones, de manera que podemos usarla para recolectar, parsear y guardar los logs para búsquedas posteriores.
En este tutorial veremos cómo usarla.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil MacBook Pro 15′ (2.4 Ghz Intel Core I5, 8GB DDR3).
- Sistema Operativo: Mac OS Yosemite 10.10.3
- Entorno de desarrollo:
- Eclipse Mars
- Versión de Java: JDK 1.8.0_51
- Logstash 1.5.4
3. Logstash
Esta herramienta basa su funcionamiento en la integración de entradas, códecs, filtros y salidas. Las entradas son las fuentes de datos que se usarán posteriormente; los códecs convierten un formato de entrada en otro que Logstash acepte, y éste último formato en otro de salida. Los códecs se usan (normalmente) cuando los datos no son texto plano.
Los filtros son acciones usadas para procesar eventos, modificándolos o eliminarios. Por último, las salidas son los destinos donde se enviarán los datos procesados.
Fuente: Logstash download page
La gran diferencia de Logstash con el resto de herramientas del estilo reside en que tiene a su disposición un gran número de plugins para las tres partes de las que se compone.
Para cerrar este apartado, mencionar que Logstash puede configurarse para utilizar varios servidores de la siguiente forma: se enviarán los logs a un único servidor hasta que éste falle. Cuando eso ocurra, cambiará de servidor y listo. Sin embargo, los logs almacenados en el servidor que ha fallado no serán accesibles hasta la recuperación del mismo.
4. Instalación y ejemplo sencillo
Logstash necesita una versión de Java superior a la 7, por lo que lo mejor es asegurarse de que tenemos una versión de Java adecuada mediante el comando:
$ java -version java version "1.8.0_51" Java(TM) SE Runtime Environment (build 1.8.0_51-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
Perfecto.
Vamos al tema. Lo primero que tenemos que hacer es descargar Logstash desde su página de descarga. Seleccionamos el archivo .zip o .tar.gz y lo descomprimimos donde queramos.
Vamos a probar que funciona. Nos vamos al directorio que acabamos de descargar usando el conocido comando cd y ejecutamos logstash con una configuración muy simple (luego la explicamos en detalle):
cd logstash-1.5.4 bin/logstash -e 'input { stdin { } } output { stdout {} }'
La segunda línea simplemente le dice a Logstash que le vamos a pasar una configuración desde la propia linea de comandos. Esto nos permite configurar la herrramienta de forma rápida y sin tener que crear ficheros de configuración.
En este ejemplo hemos indicado que la entrada sea la propia entrada de teclado (stdin) y la salida sea la propia terminal (stdout). De este modo, si escribimos cualquier cosa en la terminal, Logstash responderá con el mismo mensaje, añadiendo una timestamp y la IP. La herramienta tarda un poquito en cargar, así que habrá que esperar a que aparezca el mensaje de que se ha cargado.
Hola adictos! 2015-08-27T10:27:07.621Z MacBook-Pro-de-Rodrigo.local Hola adictos! Probando Logstash desde la terminal 2015-08-27T10:27:08.388Z MacBook-Pro-de-Rodrigo.local Probando Logstash desde la terminal
Para finalizar la ejecución del programa, presionar la combinación de teclas Ctrl+D.
5. Algo más avanzado
Hemos visto un ejemplo muy básico de cómo funciona esta utilidad. Compliquémoslo un poco más…
Vamos a hacer que Logstash tome uno de los ficheros de log que tenga una aplicación y nos avise mediante email de que (por ejemplo) se ha hecho una petición sobre sobre un recurso, pero parseando la línea de log para tener otra representación.
Es decir, cada vez que en log aparezca esta línea:
2015-08-27 14:33:08,571 TRACE Controller [getOrder] - Request for resource #15
Queremos nos llegue un mail con la siguiente información:
{ "timestamp":"2015-08-27 14:33:08,571", "nivel":"TRACE" "componente":"Controller", "mensaje":"[getOrder] - Request for resource #15" }
5.1. Configuración de Logstash
Lo primero es configurar los plugins de Logstash: entrada, filtro y salida.
Entrada
La entrada en este caso va a ser un fichero de log alojado en el sevidor, bajo la ruta ${catalina.home}/logs/loging.log
input{ file{ path => "${catalina.home}/logs/loging.log" start_position => beginning } }
OJO: No hay que poner path relativo, ${catalina.home} hace referencia al directorio raíz del servidor en este caso. Hay que poner el path absoluto del fichero.
Filtro
Como queremos parsear la entrada, debemos crear un filtro que realice esta tarea. Para ello, hay una herramienta llamada Grok que permite parsear texto con expresiones regulares.
Para saber qué expresiones regulares usar y crear vuestras propias formas de parsear, os recomiendo que uséis las siguientes herramientas:
- Lista de patrones de Grok. Os ayudar´n a encontrar los patrones que queréis parsear.
- Constructor y test de expresiones Grok. Útil para crear y probar expresiones de parseo.
- Grok Debugger. Para probar que las expresiones creadas cumplen con lo esperado.
En nuestro caso, la expresión que buscamos es:
\A%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:nivel}\s+(?<componente>(?:[a-zA-Z0-9-]+\.)*[A-Za-z0-9$]+)\s+(-\s+)?(?=)*%{DATA:mensaje}({({[^}]+},?\s*)*})?\s*$
Como vemos, el debugger nos dice que la hemos creado de forma correcta:
Creamos el filtro pues:
filter { grok { match => { "message" => "\A%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:nivel}\s+(?<componente>(?:[a-zA-Z0-9-]+\.)*[A-Za-z0-9$]+)\s+(-\s+)?(?=)*%{DATA:mensaje}({({[^}]+},?\s*)*})?\s*$"} } }
Salida
Por último, configuramos la salida. Queremos que se nos mande un mail cada vez que aparezca en el log la línea arriba mencionada. La configuración entonces será:
output { stdout {} email { from => "logstash.alert@nowhere.com" subject => "Nueva petición en recurso" to => "rodrigo.blas@autentia.com" body => "Se ha recibido el siguiente mensaje: %{message}" options => [ "smtpIporHost", "smtp.gmail.com", "port", "587", "userName", "rodrigo.blas@autentia.com", "password", "************", "starttls", "true", "authenticationType", "plain" ] via => "smtp" htmlbody => "Nueva petición de recurso
Full Event
%{message}" } }
El fichero log-to-mail.conf completo quedaría de la siguiente forma:
log-to-mail.conf
input{ file{ path => "${catalina.home}/logs/loging.log" start_position => beginning } } filter { grok { match => { "message" => "\A%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:nivel}\s+(?<componente>(?:[a-zA-Z0-9-]+\.)*[A-Za-z0-9$]+)\s+(-\s+)?(?=)*%{DATA:mensaje}({({[^}]+},?\s*)*})?\s*$"} } } output { stdout {} email { from => "logstash.alert@nowhere.com" subject => "Nueva petición en recurso" to => "rodrigo.blas@autentia.com" body => "Se ha recibido el siguiente mensaje: %{message}" options => [ "smtpIporHost", "smtp.gmail.com", "port", "587", "userName", "rodrigo.blas@autentia.com", "password", "**********", "starttls", "true", "authenticationType", "plain" ] via => "smtp" htmlbody => "Nueva petición de recurso
Full Event
%{message}" } }
REPETIMOS: No hay que poner path relativo, ${catalina.home} hace referencia al directorio raíz del servidor en este caso. Hay que poner el path absoluto del fichero.
Bueno, pues ya estamos preparados.
5.2. Lanzando Logstash
Una vez creado el fichero de configuración, lo movemos al directorio donde esté instalado Logstash. Lo siguiente que debemos hacer es ejecutar nuestra aplicación para que el fichero de log empiece a generar datos.
Para lanzar Logstash, abrimos la terminal, vamos al directorio de instalación y ejecutamos la siguiente sentencia para probar la configuración:
bin/logstash -f log-to-mail.conf --configtest
Una vez Logstash nos da el OK, lo lanzamos con el comando:
bin/logstash -f log-to-mail.conf
Lanzamos nuestra aplicación y al realizar una petición sobre un recurso veremos cómo nos llega a nuestro correo un mail nuevo con la información del Log.
6. Conclusiones
Hemos visto un ejemplo más o menos sencillo con Logstash. Sin embargo, esta herramienta permite realizar mucho más, sobre todo si se utiliza junto con Elasticsearch, herramienta de la que nuestro compañero Daniel Rodríguez Hernández nos debaja un tutorial
Creo que tiene muchísimo potencial y que es un punto a tener en cuenta para el procesado de logs para nuestras aplicaci
Espero que este tutorial haya activado vuestras ganas de aprender más sobre Logstash. Os animo a experimentar con esta herramienta y ver qué podéis sacarle.
¡Un saludo!
Rodrigo de Blas
7. Referencias
- Logstash Documentation. elastic.
- Introducción a ELK. Jose Manuel Ferrer Mosteiro.
- Logstash custom parsing. loggly.
- Useful Logstash GROK patterns. Kyrill.
Al intentar probar al configuración, me manda el mensaje:
ERROR: Unrecognised option ‘–configtest’