La centralisation et l'analyse des logs sont des piliers de l'observabilité des systèmes modernes. Filebeat, en tant qu'agent léger de la suite Elastic, joue un rôle essentiel dans la collecte de ces journaux et leur acheminement vers Elasticsearch pour une exploration ultérieure dans Kibana. Une configuration adéquate de Filebeat permet non seulement de collecter efficacement les logs, mais aussi de les structurer de manière optimale, notamment en définissant des schémas d'indexation personnalisés pour une meilleure organisation et performance.
Cet article détaille une configuration avancée de Filebeat pour gérer divers types de journaux applicatifs, en spécifiant des index Elsaticsearch distincts basés sur la source du log et en configurant le traitement des lignes multiples, essentiel pour des logs comme les traces de pile Java.
Définition des Sources de Logs (Inputs)
La section filebeat.inputs permet de spécifier les fichiers journaux à surveiller. Chaque entrée peut être configurée indépendamment avec son chemin, des champs personnalisés pour identifier l'application ou le service, et des règles pour la gestion des logs multilignes.
filebeat.inputs:
- type: log
enabled: true
paths:
- /chemin/vers/logs/service_alpha/erreur_*.log
fields:
application_id: "service-alpha"
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
multiline.negate: true
multiline.match: after
- type: log
enabled: true
paths:
- /chemin/vers/logs/service_beta/journal_*.log
fields:
application_id: "service-beta"
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' # Pour les traces de pile Java
multiline.negate: false
multiline.match: after
Dans cet exemple, nous définissons deux entrées:
- Les logs du
service-alpha, identifiés par le champapplication_id. Le motif multiligne regroupe les lignes qui ne commencent pas par un horodatage (negate: true), les attachant à la ligne précédente (match: after). - Les logs du
service-beta, également identifiés. Ici, le motif est conçu pour les traces de pile Java, regroupant les lignes commençant par des espaces, "at", "...", ou "Caused by:" avec la ligne précédente.
Configuration du Template d'Index et de l'ILM
Pour une gestion personnalisée des index dans Elasticsearch, il est souvent nécessaire de désactiver la gestion du cycle de vie des index (ILM) par défaut et de définir son propre modèle d'index.
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.template.name: "app_log_template"
setup.template.pattern: "app-logs-*"
setup.template.overwrite: true
setup.template.enabled: true
# Important: Désactiver l'ILM pour une gestion manuelle des noms d'index
setup.ilm.enabled: false
Ici, un template nommé app_log_template est créé, qui sera appliqué à tous les index commençant par app-logs-. Le nombre de shards par index est défini à 1 pour cet exemple. La désactivation de setup.ilm.enabled est cruciale pour permettre à Filebeat de créer des index avec des noms personnalisés basés sur des champs de log et des horodatages.
Cible Elasticsearch et Nommage Conditionnel des Index
La sortie vers Elasticsearch est configurée avec des règles de nommage d'index conditionnelles, ce qui est fondamental pour créer des modèles d'index distincts dans Kibana.
setup.kibana:
hosts: ["192.168.100.163:5601"]
output.elasticsearch:
hosts: ["192.168.100.163:9200"]
# Index par défaut si aucune condition ne correspond
index: "app-logs-general-%{+yyyy.MM.dd}"
indices:
- index: "app-logs-service-alpha-%{+yyyy.MM.dd}"
when.equals:
fields.application_id: "service-alpha"
- index: "app-logs-service-beta-%{+yyyy.MM.dd}"
when.equals:
fields.application_id: "service-beta"
Cette configuration dirige les logs vers des hôtes Elasticsearch et Kibana spécifiques. Plus important encore, la section indices utilise des conditions (when.equals) basées sur le champ fields.application_id pour créer des index quotidiens distincts (par exemple, app-logs-service-alpha-2023.10.27 ou app-logs-service-beta-2023.10.27). Cela permet une granularité fine lors de la création de modèles d'index dans Kibana (par exemple, app-logs-service-alpha-*) pour visualiser les logs spéciifques à chaque service.
Traitement des Champs (Processors)
Les processeurs sont utilisés pour modifier, enrichir ou filtrer les données avant qu'elles ne soient envoyées à Elasticsearch. Le processeur drop_fields est particulièrement utile pour réduire la taille des index en éliminant les champs non nécessaires.
processors:
- drop_fields:
fields:
- "agent.id"
- "agent.type"
- "agent.version"
- "host.name"
- "ecs.version"
- "log.file.path"
- "input.type"
- "cloud.provider"
- "cloud.instance.id"
Cette liste de champs est généralement générée par Filebeat ou d'autres processeurs et peut ne pas être pertinente pour l'analyse finale, d'où leur suppression pour optimiser l'espace de stockage et potentiellement améliorer les performances de recherche.
Détails sur la Configuration Multiligne
Le traitement des logs multilignes est crucial pour les journaux qui s'étendent sur plusieurs lignes, comme les messages d'erreur ou les traces de pile. Voici les paramètres clés:
multiline.pattern: Expression régulière qui définit le début d'une nouvelle ligne ou la continuation d'une ligne existante.multiline.negate: Un booléen (trueoufalse). Sitrue, le motif est inversé; les lignes qui ne correspondent pas au motif sont considérées comme faisant partie du message précédent. Sifalse, les lignes qui correspondent au motif sont considérées comme faisant partie du message précédent.multiline.match: Spécifie si la ligne correspondante doit être ajoutéeafter(après) oubefore(avant) la ligne à laquelle elle est concaténée.
Exemples de Motifs Multilignes
Pour un log de type C ou de format simple où chaque ligne de suite est une continuation:
multiline.pattern: '\\$' # Si la continuation est marquée par un '$'
multiline.negate: false
multiline.match: before
Pour regrouper les traces de pile Java (lignes commençant par des espaces, "at", "...", ou "Caused by:"):
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after
Pour les logs où chaque nouvelle entrée commence par un horodatage (format YYYY-MM-DD):
multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true # Les lignes qui ne commencent PAS par ce motif sont des continuations
multiline.match: after
Ces configurations permettent à Filebeat de transformer des fichiers journaux bruts en événements structurés et cohérents, prêts pour une analyse approfondie dans Kibana.