1. Los filtros #
Transformar los eventos.
Los filtros esenciales #
| Filtro | Función |
|---|---|
| mutate | renombrar, convertir, eliminar, añadir campos |
| date | rellenar @timestamp a partir de un campo de fecha |
| json / kv | decodificar JSON o pares clave=valor |
| drop | eliminar eventos inútiles |
| fingerprint | calcular un identificador estable |
filter {
json { source => "message" skip_on_invalid_json => true }
date { match => ["time", "ISO8601"] remove_field => ["time"] }
mutate {
rename => { "lvl" => "[log][level]" }
convert => { "[http][response][status_code]" => "integer" }
}
if [url][path] == "/health" { drop {} }
}2. El plugin grok #
Patrones con nombre.
Principio #
grok asocia expresiones regulares con nombre a campos: %{IP:[source][ip]} captura una dirección IP en source.ip. Se incluyen más de 120 patrones (IP, NUMBER, TIMESTAMP_ISO8601, COMBINEDAPACHELOG…).
# 2026-11-09T10:15:00Z ERROR 203.0.113.7 GET /api/commande 500 132ms
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:ts} %{LOGLEVEL:[log][level]} %{IP:[source][ip]} %{WORD:[http][request][method]} %{URIPATH:[url][path]} %{NUMBER:[http][response][status_code]:int} %{NUMBER:duree_ms:int}ms" }
}Buena práctica: Construye tus patrones con el Grok Debugger de Kibana (Dev Tools) y ánclalos (^…$): un patrón sin anclar que falla recorre toda la línea y consume mucha CPU.Error común: Ignorar la etiqueta _grokparsefailure: las líneas no reconocidas se envían sin estructura y falsean los paneles. Vigílala y envía esos eventos a un data stream aparte.3. ¿dissect o grok? #
Elegir la herramienta adecuada.
dissect #
dissect divide la línea según delimitadores fijos, sin expresiones regulares: es mucho más rápido, pero no sabe tratar un formato variable.
dissect {
mapping => { "message" => "%{ts} %{[log][level]} %{[source][ip]} %{[http][request][method]} %{[url][path]} %{[http][response][status_code]} %{duree}" }
}| dissect | grok | |
|---|---|---|
| Método | delimitadores | expresiones regulares |
| Rendimiento | muy rápido | más costoso |
| Formato variable | no | sí (alternativas, partes opcionales) |
| Tipado | con mutate o convert_datatype | en el patrón (:int) |
Buena práctica: Combina ambos: dissect para la cabecera fija de la línea y grok solo para la parte variable.
