Cada versión de Logstash tiene una versión de ES recomendada.
Descargar LogStash: https://www.elastic.co/downloads/logstash
Dependencia: Java (JDK / JRE).
Se recomienda instalar desde el repositorio oficial para que se instale los scripts de inicio, lugar donde se configuran variables del inicio para amoldarlo a las necesidades.
Descargar LogStash: https://www.elastic.co/downloads/elasticsearch
Con la opción “-e” se especifica la configuración desde la propia linea de comandos.
logstash -e 'input { stdin { } } output { stdout {} }'
Para modificar la salida de logstash se pueden utilizar codecs.
logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'
Escribimos cualquier tipo de frase o palabra y obtendremos una respuesta como la siguiente.
goodnight moon { "message" => "XXXXX", "@timestamp" => "2013-11-20T23:48:05.335Z", "@version" => "1", "host" => "XXXXX" }
Ahora que hemos probado como funciona de forma básica, configuramos que la salida no se muestre solo en pantalla, si no que sea guardada también en el servicio ElasticSearch. Se creará por defecto un índice logstash-YYYY.MM.DD de forma automática y contendrá tantos documentos como lineas agreguemos. Se especifican múltiples salidas (ES y la pantalla).
./logstash -e 'input { stdin { } } output { elasticsearch { host => localhost cluster => esfa} stdout{} }'
NOTA: La directiva clúster es necesaria si elasticsearch corre en dicho modo.
Por defecto LogStash crea un índice para cada día de forma automática y el mismo hace la rotación a media noche (UTC).
# Comentarios input { ... } filter { ... } output { ... }
NOTA: El orden de los ficheros de entrada, filtros y salidas es importante.
Instalación / Desinstalación / Actualización de Plugins.
# Instalación automática sin necesidad de descargar nada manualmente. bin/plugin install logstash-output-kafka # Usando un fichero (plugin) previamente descargado. plugin install /path/to/logstash-output-kafka-1.0.0.gem # Desinstalación de un Plugin. bin/plugin uninstall logstash-output-kafka # Actualizar todos / algunos plugins. bin/plugin update bin/plugin update logstash-output-kafka # Listar todos Plugins, específicos o grupos de plugins. bin/plugin list bin/plugin list <namefragment> bin/plugin list --group output
Cada plugin requiere sus propios tipos de valor.
Array: Una cadena o varias
path => [ "/var/log/messages", "/var/log/*.log" ] path => "/data/mysql/mysql.log"
Booleano: Verdadero o falso.
ssl_enable => true
Bytes: Define una unidad de byte, útil para definir tamaños en las opciones de los plugin. base-1000 / SI : (k M G T P E Z Y) y base-1020 / Binario : (Ki Mi Gi Ti Pi Ei Zi Yi) . Si no se especifica unidad son bytes.
my_bytes => "1113" # 1113 bytes my_bytes => "10MiB" # 10485760 bytes my_bytes => "100kib" # 102400 bytes my_bytes => "180 mb" # 180000000 bytes
Codec: Nombre del codec de logstash encargado de representar los datos, se puede especificar en el plugin de entrada y en el de salida.
codec => "json"
Hash: Pares de llaves - valor (cuando se definen varios se deben separar sin comas, solo espacios en blanco).
match => { "field1" => "value1" "field2" => "value2" ... }
Números (entero o coma flotante).
port => 33
Cadenas (siempre debe estar entre comillas).
name => "Hello world"
Password: Cadena que no es logueada o mostrada
my_password => "password"
Path: Cadena que muestra una ruta valida del sistema.
my_path => "/tmp/logstash"
NOTA: Esto no es válido para el bloque del plugin input, solo para filter y output.
Todos los eventos (una entrada de un log) tienen propiedades que logstash califica como campos (fields). Ej, “status code 200”, “request path /”, “IP”, etc…
Referenciar un campo en concreto se hace mediante corchetes y si es anidado se debe especificar también con corchetes como se ve a continuación.
{ "agent": "Mozilla/5.0 (compatible; MSIE 9.0)", "ip": "192.168.24.44", "request": "/index.html" "response": { "status": 200, "bytes": 52353 }, "ua": { "os": "Windows 10" } }
Para referirnos al campo del sistema operativo “Windows 10” la referencia es [ua][os].
Formato sprint: Permite referenciar un campo desde dentro de una cadena.
output { statsd { increment => "apache.%{[response][status]}" } }
En vez de usar un campo se puede especificar un formato de fecha, que junto con el campo type crea el nombre del fichero de salida.
output { file { path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}" } }
Es posible hacer pilas de condiciones complejas y combinar unas dentro de otras.
if EXPRESSION { ... } else if EXPRESSION { ... } else { ... }
Operadores de comparación.
Operadores booleanos: and, or, nand, xor
Operador binario para negar: !
Operador para realizar agrupaciones: (…)
Ejemplos
filter { if [action] == "login" and [host] == "dominio.com" { mutate { remove => "secret" } } } filter { if [foo] in [foobar] { mutate { add_tag => "field in field" } } if [foo] in "foo" { mutate { add_tag => "field in string" } } if "hello" in [greeting] { mutate { add_tag => "string in field" } } if [foo] in ["hello", "world", "foo"] { mutate { add_tag => "field in list" } } if [missing] in [alsomissing] { mutate { add_tag => "shouldnotexist" } } if !("foo" in ["hello", "world"]) { mutate { add_tag => "shouldexist" } } }
Este campo está solo disponible a partir de LogStash >= 1.5.
Este campo es útil para usarlo en algún momento cuando temporalmente sea necesario un campo que no deba incluirse en las salidas.
./logstash -e 'input { stdin { } } filter { mutate { add_field => { "show" => "This data will be in the output" } } mutate { add_field => { "[@metadata][test]" => "Hello" } } mutate { add_field => { "[@metadata][no_show]" => "This data will not be in the output" } } } output { if [@metadata][test] == "Hello" { stdout { codec => rubydebug } } }' Logstash startup completed
Insertamos la cadena: HOLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
{ "message" => "HOLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "@version" => "1", "@timestamp" => "2015-06-08T14:13:14.271Z", "host" => "es1", "show" => "This data will be in the output" }
Si se quieren ver el campo @metada y sus subcampos, se debe activar dentro de las propiedades del codec rubydebug (único codec que puede hacerlo).
stdout { codec => rubydebug { metadata => true } }
Ejemplo de uso para sobreescribir el @timestamp por el proporcionado en el mensaje.
./logstash -e 'input { stdin { } } filter { grok { match => [ "message", "%{HTTPDATE:[@metadata][timestamp]}" ] } date { match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { stdout { codec => rubydebug } }'
De esta manera no tenemos dos campos con el mismo valor (timestamp y @timestamp) y evitamos tener que borrar posteriormente el campo timestamp. Este uso es algo más avanzado y se entederá posteriormente después de haber practicado un poco con LogStash.
Input (https://www.elastic.co/guide/en/logstash/current/input-plugins.html)
Filtros (https://www.elastic.co/guide/en/logstash/current/filter-plugins.html)
Se pueden combinar con condiciones para realizar alguna acción o filtrar por algún criterio.
Output (https://www.elastic.co/guide/en/logstash/current/output-plugins.html)
Los eventos una vez filtrados pueden tener múltiples salidas.
Codecs (https://www.elastic.co/guide/en/logstash/current/codec-plugins.html)
Tiene la propiedad de filrar una entrada o salida, solo se usan en los plugins “Input” y “Output”.
Colas en LogStash.
Los eventos se van procesando parte por parte usando unas colas mediante “SizedQueue”, cuyo máximo es 20 y no puede ser modificado. Si se exceden esos 20 las entradas en la cola son bloqueadas.
Hay una cola por cada miembro de la tubería (pipeline), es decir, input, filter y output. Si el hilo que maneja output no puede escribir en disco, este espera a poder hacerlo y deja de leer de su cola, cuando esta esta se llena, el hilo perteneciente al filtro no puede seguir escribiendo en esa cola y deja de leer su cola saturando también la cola del input. Esto produce una pérdida de todos los eventos que no pueden ser encolados. Por ello se suele recomendar el uso de aplicaciones como RabbitMQ.
Hilos en LogStash.
Los hilos siguen la siguiente estructura (el filtro es opcional).
input threads | filter worker threads | output worker input threads | output worker
Si se hace un debug de los hilos java en funcionamiento se debe prestar atención a las siguientes etiquetas para poder detectar donde se encuentra el problema / cuello de botella.
Algunos paquetes (rpm, deb,..) de Logstash ya traen incorporada dicha configuración para logrotate de forma automática.
Fichero: /etc/logrotate.d/logstash
/var/log/logstash/*.log { daily rotate 7 copytruncate compress delaycompress missingok notifempty }
Ejemplo.
ls -lt /var/log/logstash/ total 63612 -rw-r--r-- 1 logstash logstash 35586668 Nov 24 16:14 logstash.log -rw-r--r-- 1 logstash logstash 29522368 Nov 24 03:14 logstash.log-20151124 -rw-r--r-- 1 logstash logstash 327 Nov 24 03:14 logstash.log-20151123.gz -rw-r--r-- 1 logstash logstash 5790 Nov 23 03:43 logstash.log-20151122.gz -rw-r--r-- 1 logstash logstash 5065 Nov 22 03:40 logstash.log-20151121.gz -rw-r--r-- 1 root root 57 Nov 20 16:48 logstash.stdout -rw-r--r-- 1 root root 0 Nov 20 16:48 logstash.err