

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 des messages du journal Amazon ECS multiligne ou de suivi de pile
<a name="firelens-concatanate-multiline"></a>

À 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](https://docs.fluentbit.io/manual/pipeline/filters/multiline-stacktrace). 

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 les messages de journal divisés par le moteur d'exécution du conteneur en suivant l'exemple suivant GitHub : [FireLens Exemple : Partial/Split Concaténer](https://github.com/aws-samples/amazon-ecs-firelens-examples/tree/mainline/examples/fluent-bit/filter-multiline-partial-message-mode) les journaux de conteneur.

## Autorisations IAM requises
<a name="iam-permissions"></a>

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. 
+ Un rôle IAM d’exécution de tâche 

Vous avez besoin des autorisations suivantes :
+ `logs:CreateLogStream`
+ `logs:CreateLogGroup`
+ `logs:PutLogEvents`

## Déterminez à quel moment utiliser le paramètre de journal multiligne
<a name="determine-filter"></a>

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
<a name="parse-multiline-log"></a>

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](https://docs.fluentbit.io/manual/pipeline/filters/multiline-stacktrace).

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
<a name="customer-parser"></a>

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

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

1. 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.

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

1. 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`. 

1. 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.

   1. Enregistrez le fichier sous le nom `parsers_multiline.conf`. 

1. 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é](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-taskdef.html#firelens-taskdef-customconfig) 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. 

   1. Enregistrez le fichier sous le nom `extra.conf`. 

1. 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
      ```

   1. Enregistrez le fichier sous le nom `Dockerfile`.

1. 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.

   1. 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`.

1. 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. 

   1. É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` 

   1. 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`.

   1. 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.

   1. 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` 

1. Créez un fichier script Python.

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

   1. 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.")
      ```

   1. Enregistrez le fichier `main.py`.

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

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

   1. 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...
      ```

   1. Enregistrez le fichier `test.log`.

1. 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"]
      ```

   1. Enregistrez le fichier `Dockerfile`.

1. À 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.

   1. 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`.

1. 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. 

   1. É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` 

   1. 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`.

   1. 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`. 

1. 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é).

   1. `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é).

   1. `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.

   1. `us-east-1`

      Remplacez la région si nécessaire.

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

1. Ouvrez la console à la [https://console.aws.amazon.com/ecs/version 2](https://console.aws.amazon.com/ecs/v2).

1. 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.

1. Choisissez la dernière version. 

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

1. 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. 

1. 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/](https://console.aws.amazon.com/cloudwatch/).

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

1. Choisissez le groupe de journaux `multiline-test/applicatio`. 

1. 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
<a name="fluent-bit-parser"></a>

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

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

1. 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.

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

1. 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`. 

1. 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é](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-taskdef.html#firelens-taskdef-customconfig) 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
      ```

   1. Enregistrez le fichier sous le nom `extra.conf`. 

1. 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
      ```

   1. Enregistrez le fichier sous le nom `Dockerfile`.

1. 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.

   1. 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`.

1. 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. 

   1. É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` 

   1. 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`.

   1. 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.

   1. 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` 

1. Créez un fichier script Python.

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

   1. 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.")
      ```

   1. Enregistrez le fichier `main.py`.

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

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

   1. 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
      ```

   1. Enregistrez le fichier `test.log`.

1. 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"]
      ```

   1. Enregistrez le fichier `Dockerfile`.

1. À 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.

   1. 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`.

1. 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. 

   1. É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` 

   1. 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`.

   1. 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`. 

1. 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é).

   1. `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é).

   1. `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.

   1. `us-east-1`

      Remplacez la région si nécessaire.

1. 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` 

1. Ouvrez la console à la [https://console.aws.amazon.com/ecs/version 2](https://console.aws.amazon.com/ecs/v2).

1. 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.

1. Choisissez la dernière version. 

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

1. 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. 

1. 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/](https://console.aws.amazon.com/cloudwatch/).

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

1. Choisissez le groupe de journaux `multiline-test/applicatio`. 

1. 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](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support) au lieu du filtre.