filter - tutorial - Cómo manejar los filtros de logstash no coincidentes
logstash tutorial español (4)
Cuando sea posible, usaría un envoltorio condicional como el que está usando. Siéntase libre de publicar eso como una respuesta!
Si su aplicación produce solo unos pocos formatos de línea diferentes, puede utilizar varios patrones de coincidencia con el filtro de grok . Por defecto, el filtro procesará hasta la primera coincidencia exitosa:
grok {
patterns_dir => "./patterns"
match => [
"message", "%{BASE_PATTERN} %{EXTRA_PATTERN}",
"message", "%{BASE_PATTERN}",
"message", "%{SOME_OTHER_PATTERN}"
]
}
Si su lógica es menos sencilla (quizás necesite verificar la misma condición más de una vez), el filtro grep puede ser útil para agregar una etiqueta. Algo como esto:
grep {
drop => false #grep normally drops non-matching events
match => ["message", "/took/s/d+/"]
add_tag => "has_traceback"
}
...
if "has_traceback" in [tags] {
...
}
Me pregunto cuál es el mejor enfoque a seguir con mis filtros Logstash Grok. Tengo algunos filtros que son para entradas de registro específicas y no se aplicarán a todas las entradas. Los que no se aplican siempre generan etiquetas _grokparsefailure. Por ejemplo, tengo un filtro de grok para cada entrada de registro y funciona bien. Luego tengo otro filtro que es para mensajes de error con rastreos. El filtro de rastreo arroja un error grave para cada entrada de registro que no tiene un rastreo.
Preferiría que solo pasara la regla si no hay una coincidencia en lugar de agregar la etiqueta parsefailure. Utilizo la etiqueta parsefailure para encontrar cosas que no se analizan correctamente, no cosas que simplemente no coinciden con un filtro en particular. Tal vez sea solo la nomenclatura "fallo de análisis" lo que me molesta. Para mí, eso significa que hay algo mal con el filtro (por ejemplo, mal formateado), no que no coincida.
Entonces la pregunta es, ¿cómo debo manejar esto?
Hacer el patrón de filtro opcional usando?
(ab) use la opción tag_on_failure configurándola en nada []
condiciona el filtro usando algo como "if traceback in message"
otra cosa que no estoy considerando?
Gracias por adelantado.
EDITAR
Tomé el camino de agregar un condicional alrededor del filtro:
if [message] =~ /took/s/d+/ {
grok {
patterns_dir => "/etc/logstash/patterns"
match => ["message", "took/s+(?<servicetime>[/d/.]+)"]
add_tag => [ "stats", "servicetime" ]
}
}
Todavía estoy interesado en comentarios sin embargo. ¿Qué se considera "mejor práctica" aquí?
Esta es la forma más eficiente de hacer esto. Ignorar el filtro
filter {
grok {
match => [ "message", "something"]
}
if "_grokparsefailure" in [tags] {
drop { }
}
}
También puedes agregar tag_on_failure => []
a tu stanza grok de la siguiente manera:
grok {
match => ["context", "/"tags/":/[%{DATA:apptags}/]"]
tag_on_failure => [ ]
}
grok seguirá fallando, pero lo hará sin agregar a la matriz de etiquetas.
También puedes hacer esto
remove_tag => ["_grokparsefailure"]
siempre que tengas una coincidencia.