Concaténation de messages de journal Amazon ECS multilignes ou empilés - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Concaténation de messages de journal Amazon ECS multilignes ou empilés

À partir de AWS la version 2.22.0 de Fluent Bit, un filtre multiligne est inclus. Le filtre multiligne aide à concaténer les messages de journaux qui appartiennent à l'origine à un seul contexte, mais qui ont été divisés en plusieurs enregistrements ou lignes de journal. Pour plus d'informations sur le filtre multiligne, consultez la documentation de Fluent Bit.

Voici des exemples courants de messages de journaux divisés :

  • Suivis de pile.

  • Applications qui impriment des journaux sur plusieurs lignes.

  • Messages de journal qui ont été divisés, car ils étaient plus longs que la taille maximale de mémoire tampon d'exécution spécifiée. Vous pouvez concaténer des messages de journal divisés par l'environnement d'exécution du conteneur en suivant l'exemple suivant GitHub : FireLens Exemple : Concaténer des journaux de conteneur partiels/divisés.

Autorisations IAM requises

Vous disposez des autorisations IAM nécessaires pour que l'agent du conteneur extrait les images du conteneur depuis Amazon ECR et pour que le conteneur achemine les journaux vers CloudWatch Logs.

Pour ces autorisations, vous devez disposer des rôles suivants :

  • Un rôle IAM de tâche.

  • Rôle IAM d'exécution de tâches.

Pour utiliser l’éditeur de politique JSON afin de créer une politique
  1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à https://console.aws.amazon.com/iam/l'adresse.

  2. Dans le panneau de navigation de gauche, sélectionnez Policies (Politiques).

    Si vous sélectionnez Politiques pour la première fois, la page Bienvenue dans les politiques gérées s’affiche. Sélectionnez Mise en route.

  3. En haut de la page, sélectionnez Créer une politique.

  4. Dans la section Éditeur de politique, choisissez l’option JSON.

  5. Entrez le document de politique JSON suivant :

    { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:CreateLogGroup", "logs:PutLogEvents" ], "Resource": "*" }] }
  6. Choisissez Suivant.

    Note

    Vous pouvez basculer à tout moment entre les options des éditeurs visuel et JSON. Toutefois, si vous apportez des modifications ou si vous choisissez Suivant dans l’éditeur visuel, IAM peut restructurer votre politique afin de l’optimiser pour l’éditeur visuel. Pour plus d’informations, consultez la page Restructuration de politique dans le Guide de l’utilisateur IAM.

  7. Sur la page Vérifier et créer, saisissez un Nom de politique et une Description (facultative) pour la politique que vous créez. Vérifiez les Autorisations définies dans cette politique pour voir les autorisations accordées par votre politique.

  8. Choisissez Create policy (Créer une politique) pour enregistrer votre nouvelle politique.

Déterminez à quel moment utiliser le paramètre de journal multiligne

Vous trouverez ci-dessous des exemples d'extraits de journal que vous pouvez voir dans la console CloudWatch Logs avec le paramètre de journal par défaut. Vous pouvez regarder la ligne qui commence par log pour déterminer si vous avez besoin du filtre multiligne. Lorsque le contexte est le même, vous pouvez utiliser le paramètre de journal multiligne. Dans cet exemple, le contexte est « com.myproject.model ». MyProject».

2022-09-20T15:47:56:595-05-00 {"container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name": "example-app", "source=": "stdout", "log": ": " at com.myproject.modele.(MyProject.badMethod.java:22)", { "container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name: ": "example-app", "source": "stdout", "log": ": " at com.myproject.model.MyProject.badMethod(MyProject.java:22)", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:region:123456789012:task/default/b23c940d29ed4714971cba72cEXAMPLE", "ecs_task_definition": "firelense-example-multiline:3" }
2022-09-20T15:47:56:595-05-00 {"container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name": "example-app", "stdout", "log": ": " at com.myproject.modele.(MyProject.oneMoreMethod.java:18)", { "container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name: ": "example-app", "source": "stdout", "log": ": " at com.myproject.model.MyProject.oneMoreMethod(MyProject.java:18)", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:region:123456789012:task/default/b23c940d29ed4714971cba72cEXAMPLE, "ecs_task_definition": "firelense-example-multiline:3" }

Une fois que vous avez utilisé le paramètre de journal multiligne, la sortie ressemblera à l'exemple ci-dessous.

2022-09-20T15:47:56:595-05-00 {"container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name": "example-app", "stdout",... { "container_id": "82ba37cada1d44d389b03e78caf74faa-EXAMPLE", "container_name: ": "example-app", "source": "stdout", "log: "September 20, 2022 06:41:48 Exception in thread \"main\" java.lang.RuntimeException: Something has gone wrong, aborting!\n at com.myproject.module.MyProject.badMethod(MyProject.java:22)\n at at com.myproject.model.MyProject.oneMoreMethod(MyProject.java:18) com.myproject.module.MyProject.main(MyProject.java:6)", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:region:123456789012:task/default/b23c940d29ed4714971cba72cEXAMPLE", "ecs_task_definition": "firelense-example-multiline:2" }

Options d'analyse et de concaténation

Pour analyser les journaux et concaténer des lignes qui ont été divisées en raison de sauts de lignes, vous pouvez utiliser l'une de ces deux options.

  • Utiliser votre propre fichier d'analyseur qui contient les règles pour analyser et concaténer les lignes qui appartiennent au même message.

  • Utiliser un analyseur intégré de Fluent Bit. Pour une liste des langues supportées par les analyseurs intégrés de Fluent Bit, consultez la documentation de Fluent Bit.

Le didacticiel suivant vous guide à travers les étapes pour chaque cas d'utilisation. Les étapes vous montrent comment concaténer des lignes multiples et envoyer les journaux à Amazon. CloudWatch Vous pouvez spécifier une destination différente pour vos journaux.

Exemple : Utiliser un analyseur que vous créez

Dans cet exemple, vous allez réaliser les étapes suivantes :

  1. Créer et charger l'image d'un conteneur Fluent Bit.

  2. Créer et charger l'image d'une application multiligne de démonstration qui s'exécute, échoue, et génère un suivi de pile multiligne.

  3. Créer la définition de tâche et exécuter la tâche.

  4. Afficher les journaux pour vérifier que les messages qui couvrent plusieurs lignes apparaissent concaténés.

Création et chargement de l'image d'un conteneur Fluent Bit

Cette image inclura le fichier d'analyseur où vous spécifiez l'expression régulière et un fichier de configuration qui fait référence au fichier d'analyseur.

  1. Créez un dossier avec le nom FluentBitDockerImage.

  2. Dans ce dossier, créez un fichier d'analyseur qui contient les règles pour analyser le journal et concaténer les lignes qui appartiennent au même message.

    1. Collez le contenu suivant dans le fichier d'analyseur :

      [MULTILINE_PARSER] name multiline-regex-test type regex flush_timeout 1000 # # Regex rules for multiline parsing # --------------------------------- # # configuration hints: # # - first state always has the name: start_state # - every field in the rule must be inside double quotes # # rules | state name | regex pattern | next state # ------|---------------|-------------------------------------------- rule "start_state" "/(Dec \d+ \d+\:\d+\:\d+)(.*)/" "cont" rule "cont" "/^\s+at.*/" "cont"

      Lorsque vous personnalisez votre modèle d'expression régulière, nous vous recommandons d'utiliser un éditeur d'expressions régulières pour tester l'expression.

    2. Enregistrez le fichier sous le nom parsers_multiline.conf.

  3. Dans le dossier FluentBitDockerImage, créez un fichier de configuration personnalisé qui fait référence au fichier d'analyseur que vous avez créé à l'étape précédente.

    Pour plus d'informations sur le fichier de configuration personnalisé, consultez Spécification d'un fichier de configuration personnalisé dans le Guide du développeur Amazon Elastic Container Service

    1. Collez le contenu suivant dans le fichier :

      [SERVICE] flush 1 log_level info parsers_file /parsers_multiline.conf [FILTER] name multiline match * multiline.key_content log multiline.parser multiline-regex-test
      Note

      Vous devez utiliser le chemin absolu de l'analyseur.

    2. Enregistrez le fichier sous le nom extra.conf.

  4. Dans le dossier FluentBitDockerImage, créez le Dockerfile avec l'image Fluent Bit, l'analyseur et les fichiers de configuration que vous avez créés.

    1. Collez le contenu suivant dans le fichier :

      FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:latest ADD parsers_multiline.conf /parsers_multiline.conf ADD extra.conf /extra.conf
    2. Enregistrez le fichier sous le nom Dockerfile.

  5. En utilisant le Dockerfile, créez une image Fluent Bit personnalisée avec l'analyseur et les fichiers de configuration personnalisés inclus.

    Note

    Vous pouvez placer le fichier d'analyseur et le fichier de configuration n'importe où dans l'image Docker, sauf lorsque /fluent-bit/etc/fluent-bit.conf ce chemin de fichier est utilisé par. FireLens

    1. Créez l'image : docker build -t fluent-bit-multiline-image .

      Où : fluent-bit-multiline-image est le nom de l'image dans cet exemple.

    2. Vérifiez que l'image a été créée correctement : docker images —filter reference=fluent-bit-multiline-image

      En cas de succès, la sortie montre l'image et l'identification latest.

  6. Chargez l'image personnalisée Fluent Bit dans Amazon Elastic Container Registry.

    1. Créez un référentiel Amazon ECR pour stocker l'image : aws ecr create-repository --repository-name fluent-bit-multiline-repo --region us-east-1

      Où : fluent-bit-multiline-repo est le nom du référentiel et us-east-1 est la région dans cet exemple.

      La sortie vous donne les détails du nouveau référentiel.

    2. Étiquetez votre image avec la valeur repositoryUri de la sortie précédente : docker tag fluent-bit-multiline-image repositoryUri

      Exemple : docker tag fluent-bit-multiline-image xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-repo

    3. Exécutez l'image docker pour vérifier qu'elle s'est exécutée correctement :docker images —filter reference=repositoryUri

      Dans le résultat, le nom du référentiel passe de fluent-bit-multiline-repo àrepositoryUri.

    4. Authentifiez-vous auprès d'Amazon ECR en exécutant la commande aws ecr get-login-password et en spécifiant l'ID de registre auquel vous voulez vous authentifier : aws ecr get-login-password | docker login --username AWS --password-stdin registry ID.dkr.ecr.region.amazonaws.com

      Exemple : ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

      Un message de connexion réussie apparaît.

    5. Envoyez (push) l'image vers Amazon ECR : docker push registry ID.dkr.ecr.region.amazonaws.com/repository name

      Exemple : docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-repo

Création et chargement de l'image pour une application multiligne de démonstration

Cette image comprendra un fichier script Python qui exécute l'application et un exemple de fichier journal.

Lorsque vous exécutez la tâche, l'application simule l'exécution, puis échoue et crée un suivi de pile.

  1. Créez un dossier nommé multiline-app : mkdir multiline-app

  2. Créez un fichier script Python.

    1. Dans le dossier multiline-app, créez un fichier et nommez-le main.py.

    2. Collez le contenu suivant dans le fichier :

      import os import time file1 = open('/test.log', 'r') Lines = file1.readlines() count = 0 for i in range(10): print("app running normally...") time.sleep(1) # Strips the newline character for line in Lines: count += 1 print(line.rstrip()) print(count) print("app terminated.")
    3. Enregistrez le fichier main.py.

  3. Créez un fichier journal d'exemple.

    1. Dans le dossier multiline-app, créez un fichier et nommez-le test.log.

    2. Collez le contenu suivant dans le fichier :

      single line... Dec 14 06:41:08 Exception in thread "main" java.lang.RuntimeException: Something has gone wrong, aborting! at com.myproject.module.MyProject.badMethod(MyProject.java:22) at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18) at com.myproject.module.MyProject.anotherMethod(MyProject.java:14) at com.myproject.module.MyProject.someMethod(MyProject.java:10) at com.myproject.module.MyProject.main(MyProject.java:6) another line...
    3. Enregistrez le fichier test.log.

  4. Dans le dossier multiline-app, créez le Dockerfile.

    1. Collez le contenu suivant dans le fichier :

      FROM public.ecr.aws/amazonlinux/amazonlinux:latest ADD test.log /test.log RUN yum upgrade -y && yum install -y python3 WORKDIR /usr/local/bin COPY main.py . CMD ["python3", "main.py"]
    2. Enregistrez le fichier Dockerfile.

  5. À l'aide du Dockerfile, créez une image.

    1. Créez l'image : docker build -t multiline-app-image .

      Où : multiline-app-image est le nom de l'image dans cet exemple.

    2. Vérifiez que l'image a été créée correctement : docker images —filter reference=multiline-app-image

      En cas de succès, la sortie montre l'image et l'identification latest.

  6. Chargez l'image dans Amazon Elastic Container Registry.

    1. Créez un référentiel Amazon ECR pour stocker l'image : aws ecr create-repository --repository-name multiline-app-repo --region us-east-1

      Où : multiline-app-repo est le nom du référentiel et us-east-1 est la région dans cet exemple.

      La sortie vous donne les détails du nouveau référentiel. Notez la valeur de repositoryUri, car vous en aurez besoin dans les étapes suivantes.

    2. Étiquetez votre image avec la valeur repositoryUri de la sortie précédente : docker tag multiline-app-image repositoryUri

      Exemple : docker tag multiline-app-image xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/multiline-app-repo

    3. Exécutez l'image docker pour vérifier qu'elle s'est exécutée correctement :docker images —filter reference=repositoryUri

      Dans la sortie, le nom du référentiel passe de multiline-app-repo à la valeur de repositoryUri.

    4. Envoyez (push) l'image vers Amazon ECR : docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository name

      Exemple : docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/multiline-app-repo

Création de la définition de tâche et exécution de la tâche
  1. Créez un fichier de définition de tâche avec le nom de fichier multiline-task-definition.json.

  2. Collez le contenu suivant dans le fichier multiline-task-definition.json :

    { "family": "firelens-example-multiline", "taskRoleArn": "task role ARN, "executionRoleArn": "execution role ARN", "containerDefinitions": [ { "essential": true, "image": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-image:latest", "name": "log_router", "firelensConfiguration": { "type": "fluentbit", "options": { "config-file-type": "file", "config-file-value": "/extra.conf" } }, "memoryReservation": 50 }, { "essential": true, "image": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/multiline-app-image:latest", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "cloudwatch_logs", "region": "us-east-1", "log_group_name": "multiline-test/application", "auto_create_group": "true", "log_stream_prefix": "multiline-" } }, "memoryReservation": 100 } ], "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "cpu": "256", "memory": "512" }

    Remplacez les éléments suivants dans la définition de tâche multiline-task-definition.json :

    1. task role ARN

      Pour trouver l'ARN du rôle de la tâche, allez dans la console IAM. Choisissez Roles (Rôles) et trouvez le rôle de tâche ecs-task-role-for-firelens que vous avez créé. Choisissez le rôle et copiez l'ARN qui apparaît dans la section Summary (Résumé).

    2. execution role ARN

      Pour trouver l'ARN du rôle d'exécution, allez dans la console IAM. Choisissez Roles (Rôles) et trouvez le rôle ecsTaskExecutionRole. Choisissez le rôle et copiez l'ARN qui apparaît dans la section Summary (Résumé).

    3. aws_account_id

      Pour trouver votre aws_account_id, connectez-vous à la AWS Management Console. Choisissez votre nom d'utilisateur en haut à droite et copiez votre ID de compte.

    4. us-east-1

      Remplacez la région si nécessaire.

  3. Enregistrez le fichier de définition de tâche : aws ecs register-task-definition --cli-input-json file://multiline-task-definition.json --region region

  4. Ouvrez la console à la https://console.aws.amazon.com/ecs/version 2.

  5. Dans le panneau de navigation, choisissez Task Definitions (Définitions de tâches), puis la famille firelens-example-multiline, car nous avons enregistré la définition de tâche à cette famille dans la première ligne de la définition de tâche ci-dessus.

  6. Choisissez la dernière version.

  7. Choisissez Déployer, Exécuter la tâche.

  8. Sur la page Exécuter la tâche, pour Cluster, choisissez le cluster, puis sous Mise en réseau, pour Sous-réseaux, choisissez les sous-réseaux disponibles pour votre tâche.

  9. Choisissez Créer.

Vérifiez que les messages de journal multilignes dans Amazon CloudWatch apparaissent concaténés
  1. Ouvrez la CloudWatch console à l'adresse https://console.aws.amazon.com/cloudwatch/.

  2. Dans le panneau de navigation, développez Logs (Journaux) et choisissez Log groups (Groupes de journaux).

  3. Choisissez le groupe de journaux multiline-test/applicatio.

  4. Choisissez le journal. Affichez les messages. Les lignes qui correspondent aux règles du fichier analyseur sont concaténées et apparaissent comme un seul message.

    L'extrait de journal suivant montre les lignes concaténées dans un seul événement de suivi de pile Java :

    { "container_id": "xxxxxx", "container_name": "app", "source": "stdout", "log": "Dec 14 06:41:08 Exception in thread \"main\" java.lang.RuntimeException: Something has gone wrong, aborting!\n at com.myproject.module.MyProject.badMethod(MyProject.java:22)\n at com.myproject.module.MyProject.oneMoreMethod(MyProject.java:18)\n at com.myproject.module.MyProject.anotherMethod(MyProject.java:14)\n at com.myproject.module.MyProject.someMethod(MyProject.java:10)\n at com.myproject.module.MyProject.main(MyProject.java:6)", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/default/xxxxxx", "ecs_task_definition": "firelens-example-multiline:2" }

    L'extrait de journal suivant montre comment le même message apparaît avec une seule ligne si vous exécutez un conteneur Amazon ECS qui n'est pas configuré pour concaténer les messages de journaux multilignes.

    { "log": "Dec 14 06:41:08 Exception in thread \"main\" java.lang.RuntimeException: Something has gone wrong, aborting!", "container_id": "xxxxxx-xxxxxx", "container_name": "app", "source": "stdout", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/default/xxxxxx", "ecs_task_definition": "firelens-example-multiline:3" }

Exemple : Utilisation d'un analyseur intégré de Fluent Bit

Dans cet exemple, vous allez réaliser les étapes suivantes :

  1. Créer et charger l'image d'un conteneur Fluent Bit.

  2. Créer et charger l'image d'une application multiligne de démonstration qui s'exécute, échoue, et génère un suivi de pile multiligne.

  3. Créer la définition de tâche et exécuter la tâche.

  4. Afficher les journaux pour vérifier que les messages qui couvrent plusieurs lignes apparaissent concaténés.

Création et chargement de l'image d'un conteneur Fluent Bit

Cette image comprendra un fichier de configuration qui fait référence à l'analyseur de Fluent Bit.

  1. Créez un dossier avec le nom FluentBitDockerImage.

  2. Dans le dossier FluentBitDockerImage, créez un fichier de configuration personnalisé qui fait référence au fichier d'analyseur intégré de Fluent Bit.

    Pour plus d'informations sur le fichier de configuration personnalisé, consultez Spécification d'un fichier de configuration personnalisé dans le Guide du développeur Amazon Elastic Container Service

    1. Collez le contenu suivant dans le fichier :

      [FILTER] name multiline match * multiline.key_content log multiline.parser go
    2. Enregistrez le fichier sous le nom extra.conf.

  3. Dans le dossier FluentBitDockerImage, créez le Dockerfile avec l'image Fluent Bit, l'analyseur et les fichiers de configuration que vous avez créés.

    1. Collez le contenu suivant dans le fichier :

      FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:latest ADD extra.conf /extra.conf
    2. Enregistrez le fichier sous le nom Dockerfile.

  4. En utilisant le Dockerfile, créez une image Fluent Bit personnalisée avec le fichier de configuration personnalisé inclus.

    Note

    Vous pouvez placer le fichier de configuration n'importe où dans l'image Docker, sauf si /fluent-bit/etc/fluent-bit.conf ce chemin de fichier est utilisé par FireLens.

    1. Créez l'image : docker build -t fluent-bit-multiline-image .

      Où : fluent-bit-multiline-image est le nom de l'image dans cet exemple.

    2. Vérifiez que l'image a été créée correctement : docker images —filter reference=fluent-bit-multiline-image

      En cas de succès, la sortie montre l'image et l'identification latest.

  5. Chargez l'image personnalisée Fluent Bit dans Amazon Elastic Container Registry.

    1. Créez un référentiel Amazon ECR pour stocker l'image : aws ecr create-repository --repository-name fluent-bit-multiline-repo --region us-east-1

      Où : fluent-bit-multiline-repo est le nom du référentiel et us-east-1 est la région dans cet exemple.

      La sortie vous donne les détails du nouveau référentiel.

    2. Étiquetez votre image avec la valeur repositoryUri de la sortie précédente : docker tag fluent-bit-multiline-image repositoryUri

      Exemple : docker tag fluent-bit-multiline-image xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-repo

    3. Exécutez l'image docker pour vérifier qu'elle s'est exécutée correctement :docker images —filter reference=repositoryUri

      Dans le résultat, le nom du référentiel passe de fluent-bit-multiline-repo àrepositoryUri.

    4. Authentifiez-vous auprès d'Amazon ECR en exécutant la commande aws ecr get-login-password et en spécifiant l'ID de registre auquel vous voulez vous authentifier : aws ecr get-login-password | docker login --username AWS --password-stdin registry ID.dkr.ecr.region.amazonaws.com

      Exemple : ecr get-login-password | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com

      Un message de connexion réussie apparaît.

    5. Envoyez (push) l'image vers Amazon ECR : docker push registry ID.dkr.ecr.region.amazonaws.com/repository name

      Exemple : docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-repo

Création et chargement de l'image pour une application multiligne de démonstration

Cette image comprendra un fichier script Python qui exécute l'application et un exemple de fichier journal.

  1. Créez un dossier nommé multiline-app : mkdir multiline-app

  2. Créez un fichier script Python.

    1. Dans le dossier multiline-app, créez un fichier et nommez-le main.py.

    2. Collez le contenu suivant dans le fichier :

      import os import time file1 = open('/test.log', 'r') Lines = file1.readlines() count = 0 for i in range(10): print("app running normally...") time.sleep(1) # Strips the newline character for line in Lines: count += 1 print(line.rstrip()) print(count) print("app terminated.")
    3. Enregistrez le fichier main.py.

  3. Créez un fichier journal d'exemple.

    1. Dans le dossier multiline-app, créez un fichier et nommez-le test.log.

    2. Collez le contenu suivant dans le fichier :

      panic: my panic goroutine 4 [running]: panic(0x45cb40, 0x47ad70) /usr/local/go/src/runtime/panic.go:542 +0x46c fp=0xc42003f7b8 sp=0xc42003f710 pc=0x422f7c main.main.func1(0xc420024120) foo.go:6 +0x39 fp=0xc42003f7d8 sp=0xc42003f7b8 pc=0x451339 runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003f7e0 sp=0xc42003f7d8 pc=0x44b4d1 created by main.main foo.go:5 +0x58 goroutine 1 [chan receive]: runtime.gopark(0x4739b8, 0xc420024178, 0x46fcd7, 0xc, 0xc420028e17, 0x3) /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc420053e30 sp=0xc420053e00 pc=0x42503c runtime.goparkunlock(0xc420024178, 0x46fcd7, 0xc, 0x1000f010040c217, 0x3) /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc420053e70 sp=0xc420053e30 pc=0x42512e runtime.chanrecv(0xc420024120, 0x0, 0xc420053f01, 0x4512d8) /usr/local/go/src/runtime/chan.go:506 +0x304 fp=0xc420053f20 sp=0xc420053e70 pc=0x4046b4 runtime.chanrecv1(0xc420024120, 0x0) /usr/local/go/src/runtime/chan.go:388 +0x2b fp=0xc420053f50 sp=0xc420053f20 pc=0x40439b main.main() foo.go:9 +0x6f fp=0xc420053f80 sp=0xc420053f50 pc=0x4512ef runtime.main() /usr/local/go/src/runtime/proc.go:185 +0x20d fp=0xc420053fe0 sp=0xc420053f80 pc=0x424bad runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc420053fe8 sp=0xc420053fe0 pc=0x44b4d1 goroutine 2 [force gc (idle)]: runtime.gopark(0x4739b8, 0x4ad720, 0x47001e, 0xf, 0x14, 0x1) /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc42003e768 sp=0xc42003e738 pc=0x42503c runtime.goparkunlock(0x4ad720, 0x47001e, 0xf, 0xc420000114, 0x1) /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc42003e7a8 sp=0xc42003e768 pc=0x42512e runtime.forcegchelper() /usr/local/go/src/runtime/proc.go:238 +0xcc fp=0xc42003e7e0 sp=0xc42003e7a8 pc=0x424e5c runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003e7e8 sp=0xc42003e7e0 pc=0x44b4d1 created by runtime.init.4 /usr/local/go/src/runtime/proc.go:227 +0x35 goroutine 3 [GC sweep wait]: runtime.gopark(0x4739b8, 0x4ad7e0, 0x46fdd2, 0xd, 0x419914, 0x1) /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc42003ef60 sp=0xc42003ef30 pc=0x42503c runtime.goparkunlock(0x4ad7e0, 0x46fdd2, 0xd, 0x14, 0x1) /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc42003efa0 sp=0xc42003ef60 pc=0x42512e runtime.bgsweep(0xc42001e150) /usr/local/go/src/runtime/mgcsweep.go:52 +0xa3 fp=0xc42003efd8 sp=0xc42003efa0 pc=0x419973 runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003efe0 sp=0xc42003efd8 pc=0x44b4d1 created by runtime.gcenable /usr/local/go/src/runtime/mgc.go:216 +0x58 one more line, no multiline
    3. Enregistrez le fichier test.log.

  4. Dans le dossier multiline-app, créez le Dockerfile.

    1. Collez le contenu suivant dans le fichier :

      FROM public.ecr.aws/amazonlinux/amazonlinux:latest ADD test.log /test.log RUN yum upgrade -y && yum install -y python3 WORKDIR /usr/local/bin COPY main.py . CMD ["python3", "main.py"]
    2. Enregistrez le fichier Dockerfile.

  5. À l'aide du Dockerfile, créez une image.

    1. Créez l'image : docker build -t multiline-app-image .

      Où : multiline-app-image est le nom de l'image dans cet exemple.

    2. Vérifiez que l'image a été créée correctement : docker images —filter reference=multiline-app-image

      En cas de succès, la sortie montre l'image et l'identification latest.

  6. Chargez l'image dans Amazon Elastic Container Registry.

    1. Créez un référentiel Amazon ECR pour stocker l'image : aws ecr create-repository --repository-name multiline-app-repo --region us-east-1

      Où : multiline-app-repo est le nom du référentiel et us-east-1 est la région dans cet exemple.

      La sortie vous donne les détails du nouveau référentiel. Notez la valeur de repositoryUri, car vous en aurez besoin dans les étapes suivantes.

    2. Étiquetez votre image avec la valeur repositoryUri de la sortie précédente : docker tag multiline-app-image repositoryUri

      Exemple : docker tag multiline-app-image xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/multiline-app-repo

    3. Exécutez l'image docker pour vérifier qu'elle s'est exécutée correctement :docker images —filter reference=repositoryUri

      Dans la sortie, le nom du référentiel passe de multiline-app-repo à la valeur de repositoryUri.

    4. Envoyez (push) l'image vers Amazon ECR : docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository name

      Exemple : docker push xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/multiline-app-repo

Création de la définition de tâche et exécution de la tâche
  1. Créez un fichier de définition de tâche avec le nom de fichier multiline-task-definition.json.

  2. Collez le contenu suivant dans le fichier multiline-task-definition.json :

    { "family": "firelens-example-multiline", "taskRoleArn": "task role ARN, "executionRoleArn": "execution role ARN", "containerDefinitions": [ { "essential": true, "image": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/fluent-bit-multiline-image:latest", "name": "log_router", "firelensConfiguration": { "type": "fluentbit", "options": { "config-file-type": "file", "config-file-value": "/extra.conf" } }, "memoryReservation": 50 }, { "essential": true, "image": "aws_account_id.dkr.ecr.us-east-1.amazonaws.com/multiline-app-image:latest", "name": "app", "logConfiguration": { "logDriver": "awsfirelens", "options": { "Name": "cloudwatch_logs", "region": "us-east-1", "log_group_name": "multiline-test/application", "auto_create_group": "true", "log_stream_prefix": "multiline-" } }, "memoryReservation": 100 } ], "requiresCompatibilities": ["FARGATE"], "networkMode": "awsvpc", "cpu": "256", "memory": "512" }

    Remplacez les éléments suivants dans la définition de tâche multiline-task-definition.json :

    1. task role ARN

      Pour trouver l'ARN du rôle de la tâche, allez dans la console IAM. Choisissez Roles (Rôles) et trouvez le rôle de tâche ecs-task-role-for-firelens que vous avez créé. Choisissez le rôle et copiez l'ARN qui apparaît dans la section Summary (Résumé).

    2. execution role ARN

      Pour trouver l'ARN du rôle d'exécution, allez dans la console IAM. Choisissez Roles (Rôles) et trouvez le rôle ecsTaskExecutionRole. Choisissez le rôle et copiez l'ARN qui apparaît dans la section Summary (Résumé).

    3. aws_account_id

      Pour trouver votre aws_account_id, connectez-vous à la AWS Management Console. Choisissez votre nom d'utilisateur en haut à droite et copiez votre ID de compte.

    4. us-east-1

      Remplacez la région si nécessaire.

  3. Enregistrez le fichier de définition de tâche : aws ecs register-task-definition --cli-input-json file://multiline-task-definition.json --region us-east-1

  4. Ouvrez la console à la https://console.aws.amazon.com/ecs/version 2.

  5. Dans le panneau de navigation, choisissez Task Definitions (Définitions de tâches), puis la famille firelens-example-multiline, car nous avons enregistré la définition de tâche à cette famille dans la première ligne de la définition de tâche ci-dessus.

  6. Choisissez la dernière version.

  7. Choisissez Déployer, Exécuter la tâche.

  8. Sur la page Exécuter la tâche, pour Cluster, choisissez le cluster, puis sous Mise en réseau, pour Sous-réseaux, choisissez les sous-réseaux disponibles pour votre tâche.

  9. Choisissez Créer.

Vérifiez que les messages de journal multilignes dans Amazon CloudWatch apparaissent concaténés
  1. Ouvrez la CloudWatch console à l'adresse https://console.aws.amazon.com/cloudwatch/.

  2. Dans le panneau de navigation, développez Logs (Journaux) et choisissez Log groups (Groupes de journaux).

  3. Choisissez le groupe de journaux multiline-test/applicatio.

  4. Choisissez le journal et affichez les messages. Les lignes qui correspondent aux règles du fichier analyseur sont concaténées et apparaissent comme un seul message.

    L'extrait de journal suivant montre un suivi de pile Go qui est concaténé en un seul événement :

    { "log": "panic: my panic\n\ngoroutine 4 [running]:\npanic(0x45cb40, 0x47ad70)\n /usr/local/go/src/runtime/panic.go:542 +0x46c fp=0xc42003f7b8 sp=0xc42003f710 pc=0x422f7c\nmain.main.func1(0xc420024120)\n foo.go:6 +0x39 fp=0xc42003f7d8 sp=0xc42003f7b8 pc=0x451339\nruntime.goexit()\n /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003f7e0 sp=0xc42003f7d8 pc=0x44b4d1\ncreated by main.main\n foo.go:5 +0x58\n\ngoroutine 1 [chan receive]:\nruntime.gopark(0x4739b8, 0xc420024178, 0x46fcd7, 0xc, 0xc420028e17, 0x3)\n /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc420053e30 sp=0xc420053e00 pc=0x42503c\nruntime.goparkunlock(0xc420024178, 0x46fcd7, 0xc, 0x1000f010040c217, 0x3)\n /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc420053e70 sp=0xc420053e30 pc=0x42512e\nruntime.chanrecv(0xc420024120, 0x0, 0xc420053f01, 0x4512d8)\n /usr/local/go/src/runtime/chan.go:506 +0x304 fp=0xc420053f20 sp=0xc420053e70 pc=0x4046b4\nruntime.chanrecv1(0xc420024120, 0x0)\n /usr/local/go/src/runtime/chan.go:388 +0x2b fp=0xc420053f50 sp=0xc420053f20 pc=0x40439b\nmain.main()\n foo.go:9 +0x6f fp=0xc420053f80 sp=0xc420053f50 pc=0x4512ef\nruntime.main()\n /usr/local/go/src/runtime/proc.go:185 +0x20d fp=0xc420053fe0 sp=0xc420053f80 pc=0x424bad\nruntime.goexit()\n /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc420053fe8 sp=0xc420053fe0 pc=0x44b4d1\n\ngoroutine 2 [force gc (idle)]:\nruntime.gopark(0x4739b8, 0x4ad720, 0x47001e, 0xf, 0x14, 0x1)\n /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc42003e768 sp=0xc42003e738 pc=0x42503c\nruntime.goparkunlock(0x4ad720, 0x47001e, 0xf, 0xc420000114, 0x1)\n /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc42003e7a8 sp=0xc42003e768 pc=0x42512e\nruntime.forcegchelper()\n /usr/local/go/src/runtime/proc.go:238 +0xcc fp=0xc42003e7e0 sp=0xc42003e7a8 pc=0x424e5c\nruntime.goexit()\n /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003e7e8 sp=0xc42003e7e0 pc=0x44b4d1\ncreated by runtime.init.4\n /usr/local/go/src/runtime/proc.go:227 +0x35\n\ngoroutine 3 [GC sweep wait]:\nruntime.gopark(0x4739b8, 0x4ad7e0, 0x46fdd2, 0xd, 0x419914, 0x1)\n /usr/local/go/src/runtime/proc.go:280 +0x12c fp=0xc42003ef60 sp=0xc42003ef30 pc=0x42503c\nruntime.goparkunlock(0x4ad7e0, 0x46fdd2, 0xd, 0x14, 0x1)\n /usr/local/go/src/runtime/proc.go:286 +0x5e fp=0xc42003efa0 sp=0xc42003ef60 pc=0x42512e\nruntime.bgsweep(0xc42001e150)\n /usr/local/go/src/runtime/mgcsweep.go:52 +0xa3 fp=0xc42003efd8 sp=0xc42003efa0 pc=0x419973\nruntime.goexit()\n /usr/local/go/src/runtime/asm_amd64.s:2337 +0x1 fp=0xc42003efe0 sp=0xc42003efd8 pc=0x44b4d1\ncreated by runtime.gcenable\n /usr/local/go/src/runtime/mgc.go:216 +0x58", "container_id": "xxxxxx-xxxxxx", "container_name": "app", "source": "stdout", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/default/xxxxxx", "ecs_task_definition": "firelens-example-multiline:2" }

    L'extrait de journal suivant montre comment le même événement apparaît si vous exécutez un conteneur ECS qui n'est pas configuré pour concaténer les messages de journaux multilignes. Le champ du journal contient une seule ligne.

    { "log": "panic: my panic", "container_id": "xxxxxx-xxxxxx", "container_name": "app", "source": "stdout", "ecs_cluster": "default", "ecs_task_arn": "arn:aws:ecs:us-east-1:xxxxxxxxxxxx:task/default/xxxxxx", "ecs_task_definition": "firelens-example-multiline:3"
Note

Si vos journaux sont envoyés dans des fichiers journaux au lieu de la sortie standard, nous vous recommandons de spécifier les paramètres de configuration multiline.parser et multiline.key_content dans le plugin d'entrée Tail au lieu du filtre.