9.3. Activer le transfert de journaux JSON
Il est possible de configurer l’API Log Forwarding pour analyser les chaînes JSON dans un objet structuré.
9.3.1. Analyse des journaux JSON Copier lienLien copié sur presse-papiers!
Il est possible d’utiliser un objet ClusterLogForwarder pour analyser les logs JSON dans un objet structuré et les transmettre à une sortie prise en charge.
Afin d’illustrer comment cela fonctionne, supposons que vous ayez l’entrée de journal JSON structurée suivante:
Exemple d’entrée de journal JSON structurée
{"level":"info","name":"fred","home":"bedrock"}
{"level":"info","name":"fred","home":"bedrock"}
Afin d’activer l’analyse du journal JSON, vous ajoutez parse: json à un pipeline dans le ClusterLogForwarder CR, comme indiqué dans l’exemple suivant:
Exemple d’extrait montrant l’analyse: json
pipelines: - inputRefs: [ application ] outputRefs: myFluentd parse: json
pipelines:
- inputRefs: [ application ]
outputRefs: myFluentd
parse: json
Lorsque vous activez l’analyse des journaux JSON en utilisant parse: json, le CR copie l’entrée de journal structurée JSON dans un champ structuré, comme indiqué dans l’exemple suivant:
Exemple de sortie structurée contenant l’entrée de journal JSON structurée
{"structured": { "level": "info", "name": "fred", "home": "bedrock" }, "more fields..."}
{"structured": { "level": "info", "name": "fred", "home": "bedrock" },
"more fields..."}
Dans le cas où l’entrée de journal ne contient pas de JSON structuré valide, le champ structuré est absent.
9.3.2. Configuration des données de journal JSON pour Elasticsearch Copier lienLien copié sur presse-papiers!
Lorsque vos journaux JSON suivent plus d’un schéma, les stocker dans un seul index peut causer des conflits de type et des problèmes de cardinalité. Afin d’éviter cela, vous devez configurer la ressource personnalisée ClusterLogForwarder (CR) pour regrouper chaque schéma en une seule définition de sortie. De cette façon, chaque schéma est transmis à un index séparé.
Lorsque vous transmettez les logs JSON à l’instance Elasticsearch par défaut gérée par OpenShift Logging, elle génère de nouveaux indices en fonction de votre configuration. Afin d’éviter les problèmes de performance associés à un trop grand nombre d’indices, envisagez de maintenir le nombre de schémas possibles en standardisant les schémas communs.
Les types de structure
Dans le ClusterLogForwarder CR, vous pouvez utiliser les types de structure suivants pour construire des noms d’index pour le magasin de journal Elasticsearch:
StructureTypeKey est le nom d’un champ de message. La valeur de ce champ est utilisée pour construire le nom de l’index.
- Kubernetes.labels.<key> est l’étiquette de pod Kubernetes dont la valeur est utilisée pour construire le nom de l’index.
- l’élément OpenShift.labels.<key> est l’élément pipeline.label.<key> dans le ClusterLogForwarder CR dont la valeur est utilisée pour construire le nom de l’index.
- Kubernetes.container_name utilise le nom du conteneur pour construire le nom de l’index.
- StructureTypeName: Si le champ StructureTypeKey n’est pas défini ou que sa clé n’est pas présente, la valeur StructureTypeName est utilisée comme type structuré. Lorsque vous utilisez à la fois le champ StructureTypeKey et le champ StructureTypeName ensemble, la valeur StructureTypeName fournit un nom d’index de retour si la clé dans le champ StructureTypeKey est absente des données de journal JSON.
Bien que vous puissiez définir la valeur de StructureTypeKey à n’importe quel champ affiché dans le sujet "Log Record Fields", les champs les plus utiles sont affichés dans la liste précédente des types de structure.
A StructureTypeKey: kubernetes.labels.<key> exemple
Imaginez ce qui suit:
- Le cluster exécute des pods d’applications qui produisent des logs JSON dans deux formats différents, "apache" et "google".
- L’utilisateur étiquete ces pods d’application avec logFormat=apache et logFormat=google.
- Dans votre fichier ClusterLogForwarder CR YAML, vous utilisez l’extrait suivant.
Dans ce cas, l’enregistrement de journal structuré suivant va à l’index app-apache-écriture:
{ "structured":{"name":"fred","home":"bedrock"}, "kubernetes":{"labels":{"logFormat": "apache", ...}} }
{
"structured":{"name":"fred","home":"bedrock"},
"kubernetes":{"labels":{"logFormat": "apache", ...}}
}
Et l’enregistrement de journal structuré suivant va à l’index app-google-écriture:
{ "structured":{"name":"wilma","home":"bedrock"}, "kubernetes":{"labels":{"logFormat": "google", ...}} }
{
"structured":{"name":"wilma","home":"bedrock"},
"kubernetes":{"labels":{"logFormat": "google", ...}}
}
Exemple StructureTypeKey: openshift.labels.<key>
Imaginez que vous utilisez l’extrait suivant dans votre fichier ClusterLogForwarder CR YAML.
Dans ce cas, l’enregistrement de journal structuré suivant va à l’index app-myValue-write:
{ "structured":{"name":"fred","home":"bedrock"}, "openshift":{"labels":{"myLabel": "myValue", ...}} }
{
"structured":{"name":"fred","home":"bedrock"},
"openshift":{"labels":{"myLabel": "myValue", ...}}
}
Considérations supplémentaires
- L’indice Elasticsearch pour les enregistrements structurés est formé en prépendant "app-" au type structuré et en ajoutant "-write".
- Les enregistrements non structurés ne sont pas envoyés à l’index structuré. Ils sont indexés comme d’habitude dans les indices d’application, d’infrastructure ou d’audit.
- En l’absence de type structuré non vide, dirigez un enregistrement non structuré sans champ structuré.
Il est important de ne pas surcharger Elasticsearch avec trop d’indices. Il suffit d’utiliser des types structurés distincts pour des formats de journal distincts, pas pour chaque application ou espace de noms. Ainsi, la plupart des applications Apache utilisent le même format de journal JSON et le même type structuré, comme LogApache.
9.3.3. Envoi des journaux JSON à la boutique de journal Elasticsearch Copier lienLien copié sur presse-papiers!
Dans le cas d’un magasin de journal Elasticsearch, si vos entrées de journal JSON suivent différents schémas, configurez la ressource personnalisée ClusterLogForwarder (CR) pour regrouper chaque schéma JSON en une seule définition de sortie. De cette façon, Elasticsearch utilise un index distinct pour chaque schéma.
Étant donné que le transfert de différents schémas vers le même index peut causer des conflits de type et des problèmes de cardinalité, vous devez effectuer cette configuration avant de transmettre les données au magasin Elasticsearch.
Afin d’éviter les problèmes de performance associés à un trop grand nombre d’indices, envisagez de maintenir le nombre de schémas possibles en standardisant les schémas communs.
Procédure
Ajoutez l’extrait suivant à votre fichier ClusterLogForwarder CR YAML.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Utilisez le champ StructureTypeKey pour spécifier l’un des champs d’enregistrement de log.
Utilisez le champ StructureTypeName pour spécifier un nom.
ImportantAfin d’analyser les logs JSON, vous devez définir les champs StructureTypeKey et StructureTypeName.
- Dans le cas des entréesRefs, spécifiez les types de journaux à transmettre en utilisant ce pipeline, comme l’application, l’infrastructure ou l’audit.
- Ajouter l’analyse: élément json aux pipelines.
Créer l’objet CR:
oc create -f <filename>.yaml
$ oc create -f <filename>.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le Red Hat OpenShift Logging Operator redéploie les pods collector. Cependant, s’ils ne redéployent pas, supprimez les pods collector pour les forcer à redéployer.
oc delete pod --selector logging-infra=collector
$ oc delete pod --selector logging-infra=collector
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.4. Envoi des logs JSON à partir de conteneurs dans la même pod vers des indices distincts Copier lienLien copié sur presse-papiers!
Il est possible d’envoyer des journaux structurés à partir de différents conteneurs à l’intérieur d’un même pod vers différents indices. Afin d’utiliser cette fonctionnalité, vous devez configurer le pipeline avec le support multi-conteneurs et annoter les pods. Les journaux sont écrits dans des indices avec un préfixe d’application-. Il est recommandé de configurer Elasticsearch avec des alias pour y répondre.
Le formatage JSON des journaux varie selon l’application. Étant donné que la création de trop d’indices impacte la performance, limitez votre utilisation de cette fonctionnalité à la création d’indices pour les journaux qui ont des formats JSON incompatibles. Les requêtes permettent de séparer les journaux de différents espaces de noms ou d’applications avec des formats JSON compatibles.
Conditions préalables
- Enregistrement pour Red Hat OpenShift: 5.5
Procédure
Créer ou modifier un fichier YAML qui définit l’objet ClusterLogForwarder CR:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer ou modifier un fichier YAML qui définit l’objet Pod CR:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Cette configuration pourrait augmenter considérablement le nombre de fragments sur le cluster.
Ressources supplémentaires