Menggabungkan pesan log Amazon ECS multiline atau stack-trace - Amazon Elastic Container Service

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

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.

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: Concatenate Partial/Split Container Logs.

Izin IAM yang diperlukan

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.

Cara menggunakan editor kebijakan JSON untuk membuat kebijakan
  1. Masuk ke AWS Management Console dan buka konsol IAM di https://console.aws.amazon.com/iam/.

  2. Pada panel navigasi di sebelah kiri, pilih Kebijakan.

    Jika ini pertama kalinya Anda memilih Kebijakan, akan muncul halaman Selamat Datang di Kebijakan Terkelola. Pilih Memulai.

  3. Di bagian atas halaman, pilih Buat kebijakan.

  4. Di bagian Editor kebijakan, pilih opsi JSON.

  5. Masukkan dokumen kebijakan JSON berikut:

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

    catatan

    Anda dapat beralih antara opsi editor Visual dan JSON kapan saja. Namun, jika Anda melakukan perubahan atau memilih Berikutnya di editor Visual, IAM dapat merestrukturisasi kebijakan Anda untuk mengoptimalkannya bagi editor visual. Untuk informasi selengkapnya, lihat Restrukturisasi kebijakan dalam Panduan Pengguna IAM.

  7. Pada halaman Tinjau dan buat, masukkan Nama kebijakan dan Deskripsi (opsional) untuk kebijakan yang Anda buat. Tinjau Izin yang ditentukan dalam kebijakan ini untuk melihat izin yang diberikan oleh kebijakan Anda.

  8. Pilih Buat kebijakan untuk menyimpan kebijakan baru Anda.

Tentukan kapan harus menggunakan pengaturan log multiline

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

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.

Tutorial berikut memandu Anda melalui langkah-langkah untuk setiap kasus penggunaan. Langkah-langkah 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

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

  1. Buat dan unggah gambar untuk wadah Fluent Bit.

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

  3. Buat definisi tugas dan jalankan tugas.

  4. 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 namaFluentBitDockerImage.

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

    2. Simpan file sebagai parsers_multiline.conf.

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

    2. Simpan file sebagai extra.conf.

  4. 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
    2. Simpan file sebagai Dockerfile.

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

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

      Jika berhasil, output menunjukkan gambar dan latest tag.

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

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

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

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

    5. 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 bernamamultiline-app: mkdir multiline-app

  2. Buat file skrip Python.

    1. Di dalam multiline-app folder, buat file dan beri namamain.py.

    2. 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.")
    3. Simpan file main.py.

  3. Buat file log sampel.

    1. Di dalam multiline-app folder, buat file dan beri namatest.log.

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

  4. 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"]
    2. Simpan file Dockerfile.

  5. Menggunakan Dockerfile, buat gambar.

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

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

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

      Jika berhasil, output menunjukkan gambar dan latest tag.

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

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

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

    4. 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 filemultiline-task-definition.json.

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

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

    3. aws_account_id

      Untuk menemukan Andaaws_account_id, masuk ke AWS Management Console. Pilih nama pengguna Anda di kanan atas dan salin ID Akun Anda.

    4. us-east-1

      Ganti wilayah jika perlu.

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

  4. Buka konsol di https://console.aws.amazon.com/ecs/v2.

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

  6. Pilih versi terbaru.

  7. Pilih tugas Deploy, Run.

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

  9. Pilih Buat.

Verifikasi bahwa pesan log multiline di Amazon CloudWatch tampak digabungkan
  1. Buka CloudWatch konsol di https://console.aws.amazon.com/cloudwatch/.

  2. Dari panel navigasi, perluas Log dan pilih Grup log.

  3. Pilih grup multiline-test/applicatio log.

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

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

  1. Buat dan unggah gambar untuk wadah Fluent Bit.

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

  3. Buat definisi tugas dan jalankan tugas.

  4. 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 namaFluentBitDockerImage.

  2. 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 di Panduan Pengembang Layanan Amazon Elastic Container

    1. Tempel konten berikut dalam file:

      [FILTER] name multiline match * multiline.key_content log multiline.parser go
    2. Simpan file sebagai extra.conf.

  3. 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
    2. Simpan file sebagai Dockerfile.

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

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

      Jika berhasil, output menunjukkan gambar dan latest tag.

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

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

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

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

    5. 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 bernamamultiline-app: mkdir multiline-app

  2. Buat file skrip Python.

    1. Di dalam multiline-app folder, buat file dan beri namamain.py.

    2. 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.")
    3. Simpan file main.py.

  3. Buat file log sampel.

    1. Di dalam multiline-app folder, buat file dan beri namatest.log.

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

  4. 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"]
    2. Simpan file Dockerfile.

  5. Menggunakan Dockerfile, buat gambar.

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

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

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

      Jika berhasil, output menunjukkan gambar dan latest tag.

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

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

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

    4. 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 filemultiline-task-definition.json.

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

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

    3. aws_account_id

      Untuk menemukan Andaaws_account_id, masuk ke AWS Management Console. Pilih nama pengguna Anda di kanan atas dan salin ID Akun Anda.

    4. us-east-1

      Ganti wilayah jika perlu.

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

  4. Buka konsol di https://console.aws.amazon.com/ecs/v2.

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

  6. Pilih versi terbaru.

  7. Pilih tugas Deploy, Run.

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

  9. Pilih Buat.

Verifikasi bahwa pesan log multiline di Amazon CloudWatch tampak digabungkan
  1. Buka CloudWatch konsol di https://console.aws.amazon.com/cloudwatch/.

  2. Dari panel navigasi, perluas Log dan pilih Grup log.

  3. Pilih grup multiline-test/applicatio log.

  4. 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 alih-alih Filter.