

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggabungkan pesan log Amazon ECS multiline atau stack-trace
<a name="firelens-concatanate-multiline"></a>

Dimulai dengan AWS untuk Fluent Bit versi 2.22.0, filter multiline disertakan. Filter multiline membantu menggabungkan pesan log yang awalnya milik satu konteks tetapi dibagi menjadi beberapa catatan atau baris log. Untuk informasi selengkapnya tentang filter multiline, lihat dokumentasi [Fluent Bit](https://docs.fluentbit.io/manual/pipeline/filters/multiline-stacktrace). 

Contoh umum pesan log terpisah adalah:
+ Jejak tumpukan. 
+ Aplikasi yang mencetak log pada beberapa baris. 
+ Log pesan yang dibagi karena lebih panjang dari ukuran buffer maks runtime yang ditentukan. Anda dapat menggabungkan pesan log yang dibagi berdasarkan runtime container dengan mengikuti contoh di GitHub: [FireLens Contoh:](https://github.com/aws-samples/amazon-ecs-firelens-examples/tree/mainline/examples/fluent-bit/filter-multiline-partial-message-mode) Concatenate Container Logs. Partial/Split 

## Izin IAM yang diperlukan
<a name="iam-permissions"></a>

Anda memiliki izin IAM yang diperlukan untuk agen penampung untuk menarik gambar kontainer dari Amazon ECR dan wadah untuk merutekan log ke Log. CloudWatch 

Untuk izin ini, Anda harus memiliki peran berikut: 
+ Peran tugas IAM. 
+ Peran IAM eksekusi tugas. 

Anda memerlukan izin berikut:
+ `logs:CreateLogStream`
+ `logs:CreateLogGroup`
+ `logs:PutLogEvents`

## Tentukan kapan harus menggunakan pengaturan log multiline
<a name="determine-filter"></a>

Berikut ini adalah contoh cuplikan log yang Anda lihat di konsol CloudWatch Log dengan pengaturan log default. Anda dapat melihat garis yang dimulai dengan `log` untuk menentukan apakah Anda memerlukan filter multiline. Ketika konteksnya sama, Anda dapat menggunakan pengaturan log multiline, Dalam contoh ini, konteksnya adalah “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"
     }
```

Setelah Anda menggunakan pengaturan log multiline, output akan terlihat mirip dengan contoh di bawah ini. 

```
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"
     }
```

## Parse dan concatenate pilihan
<a name="parse-multiline-log"></a>

Untuk mengurai log dan menggabungkan baris yang terbagi karena baris baru, Anda dapat menggunakan salah satu dari dua opsi ini.
+ Gunakan file parser Anda sendiri yang berisi aturan untuk mengurai dan menggabungkan baris yang termasuk dalam pesan yang sama.
+ Gunakan parser bawaan Fluent Bit. Untuk daftar bahasa yang didukung oleh parser bawaan Fluent Bit, lihat Dokumentasi Bit [Lancar](https://docs.fluentbit.io/manual/pipeline/filters/multiline-stacktrace).

Tutorial berikut memandu Anda melalui langkah-langkah untuk setiap kasus penggunaan. Langkah-langkahnya menunjukkan cara menggabungkan multiline dan mengirim log ke Amazon. CloudWatch Anda dapat menentukan tujuan yang berbeda untuk log Anda.

### Contoh: Gunakan parser yang Anda buat
<a name="customer-parser"></a>

Dalam contoh ini, Anda akan menyelesaikan langkah-langkah berikut: 

1. Buat dan unggah gambar untuk wadah Fluent Bit. 

1. Buat dan unggah gambar untuk aplikasi multiline demo yang berjalan, gagal, dan menghasilkan jejak tumpukan multiline.

1. Buat definisi tugas dan jalankan tugas. 

1. Lihat log untuk memverifikasi bahwa pesan yang menjangkau beberapa baris tampak digabungkan. 

**Buat dan unggah gambar untuk wadah Fluent Bit**

Gambar ini akan menyertakan file parser tempat Anda menentukan ekspresi reguler dan file konfigurasi yang mereferensikan file parser. 

1. Buat folder dengan nama`FluentBitDockerImage`. 

1. Di dalam folder, buat file parser yang berisi aturan untuk mengurai log dan menggabungkan baris yang termasuk dalam pesan yang sama.

   1. Tempel konten berikut di file parser:

      ```
      [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"
      ```

      Saat Anda menyesuaikan pola regex Anda, kami sarankan Anda menggunakan editor ekspresi reguler untuk menguji ekspresi.

   1. Simpan file sebagai `parsers_multiline.conf`. 

1. Di dalam `FluentBitDockerImage` folder, buat file konfigurasi khusus yang mereferensikan file parser yang Anda buat di langkah sebelumnya.

   Untuk informasi selengkapnya tentang file konfigurasi kustom, lihat [Menentukan file konfigurasi kustom](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-taskdef.html#firelens-taskdef-customconfig) di Panduan *Pengembang Layanan Amazon Elastic Container* 

   1. Tempel konten berikut dalam file:

      ```
      [SERVICE]
          flush                 1
          log_level             info
          parsers_file          /parsers_multiline.conf
          
      [FILTER]
          name                  multiline
          match                 *
          multiline.key_content log
          multiline.parser      multiline-regex-test
      ```
**catatan**  
Anda harus menggunakan jalur absolut parser. 

   1. Simpan file sebagai `extra.conf`. 

1. Di dalam `FluentBitDockerImage` folder, buat Dockerfile dengan gambar Fluent Bit dan parser dan file konfigurasi yang Anda buat.

   1. Tempel konten berikut dalam file:

      ```
      FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
      
      ADD parsers_multiline.conf /parsers_multiline.conf
      ADD extra.conf /extra.conf
      ```

   1. Simpan file sebagai `Dockerfile`.

1. Menggunakan Dockerfile, buat gambar Fluent Bit kustom dengan parser dan file konfigurasi khusus disertakan.
**catatan**  
Anda dapat menempatkan file parser dan file konfigurasi di mana saja di gambar Docker kecuali `/fluent-bit/etc/fluent-bit.conf` karena jalur file ini digunakan oleh. FireLens

   1. Bangun gambar: `docker build -t fluent-bit-multiline-image.`

      Dimana: `fluent-bit-multiline-image` adalah nama untuk gambar dalam contoh ini.

   1. Verifikasi bahwa gambar telah dibuat dengan benar: `docker images —filter reference=fluent-bit-multiline-image` 

      Jika berhasil, output menunjukkan gambar dan `latest` tag.

1. Unggah gambar Fluent Bit kustom ke Amazon Elastic Container Registry.

   1. Buat repositori Amazon ECR untuk menyimpan gambar: `aws ecr create-repository --repository-name fluent-bit-multiline-repo --region us-east-1`

      Dimana: `fluent-bit-multiline-repo` adalah nama untuk repositori dan `us-east-1` merupakan wilayah dalam contoh ini. 

      Output memberi Anda rincian repositori baru. 

   1. Tandai gambar Anda dengan `repositoryUri` nilai dari output sebelumnya: `docker tag fluent-bit-multiline-image repositoryUri` 

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

   1. Jalankan docker image untuk memverifikasi itu berjalan dengan benar: `docker images —filter reference=repositoryUri`

      Dalam output, nama repositori berubah dari fluent-bit-multiline-repo ke. `repositoryUri`

   1. Otentikasi ke Amazon ECR dengan menjalankan `aws ecr get-login-password` perintah dan menentukan ID registri yang ingin Anda autentikasi: `aws ecr get-login-password | docker login --username AWS --password-stdin registry ID.dkr.ecr.region.amazonaws.com` 

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

      Pesan login yang berhasil muncul.

   1. Dorong gambar ke Amazon ECR: `docker push registry ID.dkr.ecr.region.amazonaws.com/repository name` 

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

**Membangun dan meng-upload gambar untuk aplikasi demo multiline**

Gambar ini akan mencakup file skrip Python yang menjalankan aplikasi dan file log sampel. 

Saat Anda menjalankan tugas, aplikasi mensimulasikan berjalan, lalu gagal dan membuat jejak tumpukan. 

1. Buat folder bernama`multiline-app`: `mkdir multiline-app` 

1. Buat file skrip Python.

   1. Di dalam `multiline-app` folder, buat file dan beri nama`main.py`.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `main.py`.

1. Buat file log sampel. 

   1. Di dalam `multiline-app` folder, buat file dan beri nama`test.log`.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `test.log`.

1. Di dalam `multiline-app` folder, buat Dockerfile.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `Dockerfile`.

1. Menggunakan Dockerfile, buat gambar.

   1. Bangun gambar: `docker build -t multiline-app-image `

      Dimana: `multiline-app-image` adalah nama untuk gambar dalam contoh ini.

   1. Verifikasi bahwa gambar telah dibuat dengan benar: `docker images —filter reference=multiline-app-image` 

      Jika berhasil, output menunjukkan gambar dan `latest` tag.

1. Unggah gambar ke Amazon Elastic Container Registry.

   1. Buat repositori Amazon ECR untuk menyimpan gambar: `aws ecr create-repository --repository-name multiline-app-repo --region us-east-1`

      Dimana: `multiline-app-repo` adalah nama untuk repositori dan `us-east-1` merupakan wilayah dalam contoh ini. 

      Output memberi Anda rincian repositori baru. Perhatikan `repositoryUri` nilainya karena Anda akan membutuhkannya di langkah selanjutnya. 

   1. Tandai gambar Anda dengan `repositoryUri` nilai dari output sebelumnya: `docker tag multiline-app-image repositoryUri` 

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

   1. Jalankan docker image untuk memverifikasi itu berjalan dengan benar: `docker images —filter reference=repositoryUri`

      Dalam output, nama repositori berubah dari `multiline-app-repo` ke nilai. `repositoryUri`

   1. Dorong gambar ke Amazon ECR: `docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository name` 

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

**Buat definisi tugas dan jalankan tugas**

1. Buat file definisi tugas dengan nama file`multiline-task-definition.json`. 

1. Tempel konten berikut dalam `multiline-task-definition.json` file: 

   ```
   {
       "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"
   }
   ```

   Ganti yang berikut ini dalam definisi `multiline-task-definition.json` tugas:

   1. `task role ARN`

      Untuk menemukan peran tugas ARN, buka konsol IAM. Pilih **Peran** dan temukan peran `ecs-task-role-for-firelens` tugas yang Anda buat. Pilih peran dan salin **ARN** yang muncul di bagian **Ringkasan**.

   1. `execution role ARN`

      Untuk menemukan peran eksekusi ARN, buka konsol IAM. Pilih **Peran** dan temukan `ecsTaskExecutionRole` perannya. Pilih peran dan salin **ARN** yang muncul di bagian **Ringkasan**.

   1. `aws_account_id`

      Untuk menemukan Anda`aws_account_id`, masuk ke Konsol Manajemen AWS. Pilih nama pengguna Anda di kanan atas dan salin ID Akun Anda.

   1. `us-east-1`

      Ganti wilayah jika perlu.

1. Daftarkan file definisi tugas: `aws ecs register-task-definition --cli-input-json file://multiline-task-definition.json --region region` 

1. Buka konsol di [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2).

1. Di panel navigasi, pilih **Definisi Tugas** dan kemudian pilih `firelens-example-multiline` keluarga karena kami mendaftarkan definisi tugas ke keluarga ini di baris pertama definisi tugas di atas.

1. Pilih versi terbaru. 

1. Pilih **tugas **Deploy**, Run**. 

1. Pada halaman **Jalankan Tugas**, Untuk **Cluster**, pilih cluster, dan kemudian di bawah **Jaringan**, untuk **Subnet**, pilih subnet yang tersedia untuk tugas Anda. 

1. Pilih **Buat**. 

**Verifikasi bahwa pesan log multiline di Amazon CloudWatch tampak digabungkan**

1. Buka CloudWatch konsol di [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Dari panel navigasi, perluas **Log** dan pilih **Grup log**. 

1. Pilih grup `multiline-test/applicatio` log. 

1. Pilih log. Lihat pesan. Baris yang cocok dengan aturan dalam file parser digabungkan dan muncul sebagai pesan tunggal. 

   Cuplikan log berikut menunjukkan baris yang digabungkan dalam satu peristiwa jejak tumpukan 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"
   }
   ```

   Cuplikan log berikut menunjukkan bagaimana pesan yang sama muncul hanya dengan satu baris jika Anda menjalankan wadah Amazon ECS yang tidak dikonfigurasi untuk menggabungkan pesan log multiline. 

   ```
   {
       "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"
   }
   ```

### Contoh: Gunakan parser bawaan Fluent Bit
<a name="fluent-bit-parser"></a>

Dalam contoh ini, Anda akan menyelesaikan langkah-langkah berikut: 

1. Buat dan unggah gambar untuk wadah Fluent Bit. 

1. Buat dan unggah gambar untuk aplikasi multiline demo yang berjalan, gagal, dan menghasilkan jejak tumpukan multiline.

1. Buat definisi tugas dan jalankan tugas. 

1. Lihat log untuk memverifikasi bahwa pesan yang menjangkau beberapa baris tampak digabungkan. 

**Buat dan unggah gambar untuk wadah Fluent Bit**

Gambar ini akan menyertakan file konfigurasi yang mereferensikan parser Fluent Bit. 

1. Buat folder dengan nama`FluentBitDockerImage`. 

1. Di dalam `FluentBitDockerImage` folder, buat file konfigurasi khusus yang mereferensikan file parser bawaan Fluent Bit.

   Untuk informasi selengkapnya tentang file konfigurasi kustom, lihat [Menentukan file konfigurasi kustom](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/firelens-taskdef.html#firelens-taskdef-customconfig) di Panduan *Pengembang Layanan Amazon Elastic Container* 

   1. Tempel konten berikut dalam file:

      ```
      [FILTER]
          name                  multiline
          match                 *
          multiline.key_content log
          multiline.parser      go
      ```

   1. Simpan file sebagai `extra.conf`. 

1. Di dalam `FluentBitDockerImage` folder, buat Dockerfile dengan gambar Fluent Bit dan parser dan file konfigurasi yang Anda buat.

   1. Tempel konten berikut dalam file:

      ```
      FROM public.ecr.aws/aws-observability/aws-for-fluent-bit:latest
      ADD extra.conf /extra.conf
      ```

   1. Simpan file sebagai `Dockerfile`.

1. Menggunakan Dockerfile, buat gambar Fluent Bit kustom dengan file konfigurasi khusus yang disertakan.
**catatan**  
Anda dapat menempatkan file konfigurasi di mana saja di gambar Docker kecuali `/fluent-bit/etc/fluent-bit.conf` karena jalur file ini digunakan oleh FireLens.

   1. Bangun gambar: `docker build -t fluent-bit-multiline-image.`

      Dimana: `fluent-bit-multiline-image` adalah nama untuk gambar dalam contoh ini.

   1. Verifikasi bahwa gambar telah dibuat dengan benar: `docker images —filter reference=fluent-bit-multiline-image` 

      Jika berhasil, output menunjukkan gambar dan `latest` tag.

1. Unggah gambar Fluent Bit kustom ke Amazon Elastic Container Registry.

   1. Buat repositori Amazon ECR untuk menyimpan gambar: `aws ecr create-repository --repository-name fluent-bit-multiline-repo --region us-east-1`

      Dimana: `fluent-bit-multiline-repo` adalah nama untuk repositori dan `us-east-1` merupakan wilayah dalam contoh ini. 

      Output memberi Anda rincian repositori baru. 

   1. Tandai gambar Anda dengan `repositoryUri` nilai dari output sebelumnya: `docker tag fluent-bit-multiline-image repositoryUri` 

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

   1. Jalankan docker image untuk memverifikasi itu berjalan dengan benar: `docker images —filter reference=repositoryUri`

      Dalam output, nama repositori berubah dari fluent-bit-multiline-repo ke. `repositoryUri`

   1. Otentikasi ke Amazon ECR dengan menjalankan `aws ecr get-login-password` perintah dan menentukan ID registri yang ingin Anda autentikasi: `aws ecr get-login-password | docker login --username AWS --password-stdin registry ID.dkr.ecr.region.amazonaws.com` 

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

      Pesan login yang berhasil muncul.

   1. Dorong gambar ke Amazon ECR: `docker push registry ID.dkr.ecr.region.amazonaws.com/repository name` 

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

**Membangun dan meng-upload gambar untuk aplikasi demo multiline**

Gambar ini akan mencakup file skrip Python yang menjalankan aplikasi dan file log sampel. 

1. Buat folder bernama`multiline-app`: `mkdir multiline-app` 

1. Buat file skrip Python.

   1. Di dalam `multiline-app` folder, buat file dan beri nama`main.py`.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `main.py`.

1. Buat file log sampel. 

   1. Di dalam `multiline-app` folder, buat file dan beri nama`test.log`.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `test.log`.

1. Di dalam `multiline-app` folder, buat Dockerfile.

   1. Tempel konten berikut dalam file:

      ```
      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. Simpan file `Dockerfile`.

1. Menggunakan Dockerfile, buat gambar.

   1. Bangun gambar: `docker build -t multiline-app-image `

      Dimana: `multiline-app-image` adalah nama untuk gambar dalam contoh ini.

   1. Verifikasi bahwa gambar telah dibuat dengan benar: `docker images —filter reference=multiline-app-image` 

      Jika berhasil, output menunjukkan gambar dan `latest` tag.

1. Unggah gambar ke Amazon Elastic Container Registry.

   1. Buat repositori Amazon ECR untuk menyimpan gambar: `aws ecr create-repository --repository-name multiline-app-repo --region us-east-1`

      Dimana: `multiline-app-repo` adalah nama untuk repositori dan `us-east-1` merupakan wilayah dalam contoh ini. 

      Output memberi Anda rincian repositori baru. Perhatikan `repositoryUri` nilainya karena Anda akan membutuhkannya di langkah selanjutnya. 

   1. Tandai gambar Anda dengan `repositoryUri` nilai dari output sebelumnya: `docker tag multiline-app-image repositoryUri` 

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

   1. Jalankan docker image untuk memverifikasi itu berjalan dengan benar: `docker images —filter reference=repositoryUri`

      Dalam output, nama repositori berubah dari `multiline-app-repo` ke nilai. `repositoryUri`

   1. Dorong gambar ke Amazon ECR: `docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository name` 

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

**Buat definisi tugas dan jalankan tugas**

1. Buat file definisi tugas dengan nama file`multiline-task-definition.json`. 

1. Tempel konten berikut dalam `multiline-task-definition.json` file: 

   ```
   {
       "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"
   }
   ```

   Ganti yang berikut ini dalam definisi `multiline-task-definition.json` tugas:

   1. `task role ARN`

      Untuk menemukan peran tugas ARN, buka konsol IAM. Pilih **Peran** dan temukan peran `ecs-task-role-for-firelens` tugas yang Anda buat. Pilih peran dan salin **ARN** yang muncul di bagian **Ringkasan**.

   1. `execution role ARN`

      Untuk menemukan peran eksekusi ARN, buka konsol IAM. Pilih **Peran** dan temukan `ecsTaskExecutionRole` perannya. Pilih peran dan salin **ARN** yang muncul di bagian **Ringkasan**.

   1. `aws_account_id`

      Untuk menemukan Anda`aws_account_id`, masuk ke Konsol Manajemen AWS. Pilih nama pengguna Anda di kanan atas dan salin ID Akun Anda.

   1. `us-east-1`

      Ganti wilayah jika perlu.

1. Daftarkan file definisi tugas: `aws ecs register-task-definition --cli-input-json file://multiline-task-definition.json --region us-east-1` 

1. Buka konsol di [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2).

1. Di panel navigasi, pilih **Definisi Tugas** dan kemudian pilih `firelens-example-multiline` keluarga karena kami mendaftarkan definisi tugas ke keluarga ini di baris pertama definisi tugas di atas.

1. Pilih versi terbaru. 

1. Pilih **tugas **Deploy**, Run**. 

1. Pada halaman **Jalankan Tugas**, Untuk **Cluster**, pilih cluster, dan kemudian di bawah **Jaringan**, untuk **Subnet**, pilih subnet yang tersedia untuk tugas Anda. 

1. Pilih **Buat**. 

**Verifikasi bahwa pesan log multiline di Amazon CloudWatch tampak digabungkan**

1. Buka CloudWatch konsol di [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Dari panel navigasi, perluas **Log** dan pilih **Grup log**. 

1. Pilih grup `multiline-test/applicatio` log. 

1. Pilih log dan lihat pesan. Baris yang cocok dengan aturan dalam file parser digabungkan dan muncul sebagai pesan tunggal. 

   Cuplikan log berikut menunjukkan jejak tumpukan Go yang digabungkan menjadi satu peristiwa: 

   ```
   {
       "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"
   }
   ```

   Cuplikan log berikut menunjukkan bagaimana peristiwa yang sama muncul jika Anda menjalankan wadah ECS yang tidak dikonfigurasi untuk menggabungkan pesan log multiline. Bidang log berisi satu baris.

   ```
   {
       "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"
   ```

**catatan**  
Jika log Anda masuk ke file log alih-alih output standar, kami sarankan untuk menentukan parameter `multiline.parser` dan `multiline.key_content` konfigurasi di [plugin input Tail](https://docs.fluentbit.io/manual/pipeline/inputs/tail#multiline-support) alih-alih Filter.