All Products
Search
Document Center

Simple Log Service:Kumpulkan log teks pod Kubernetes (mode sidecar)

Last Updated:Oct 11, 2026

Mode sidecar menyuntikkan kontainer LoongCollector (Logtail) khusus ke dalam setiap pod aplikasi untuk pengumpulan log per-pod. Mode ini ideal ketika Anda memerlukan kontrol detail halus, isolasi multi-tenant, atau pengumpulan log yang terikat siklus hidup.

Cara kerja

Dalam mode sidecar, kontainer aplikasi dan kontainer LoongCollector (Logtail) berjalan berdampingan dalam satu pod, berbagi volume untuk akses log dan sinkronisasi siklus hidup.

  • Berbagi log: Kontainer aplikasi menulis log ke volume bersama (biasanya emptyDir), yang dipasang oleh kontainer LoongCollector (Logtail) dalam mode read-only untuk dikumpulkan secara real time.

  • Asosiasi konfigurasi: Setiap sidecar LoongCollector (Logtail) mendeklarasikan identitasnya melalui custom identifier unik. Kelompok mesin di konsol SLS dengan identifier yang sama mendistribusikan konfigurasi pengumpulan ke semua sidecar yang sesuai.

  • Sinkronisasi siklus hidup: File sinyal (cornerstone dan tombstone) dalam volume bersama mengoordinasikan shutdown kontainer. Bersama dengan graceful termination period (terminationGracePeriodSeconds), mereka memastikan LoongCollector (Logtail) menyelesaikan pengiriman log tersisa sebelum pod keluar.

Sebelum memulai

Buat Proyek dan LogStore untuk menyimpan log Anda. Jika sudah memiliki keduanya, langsung ke Langkah 1: Suntikkan Kontainer Sidecar LoongCollector.

  • Project: Unit manajemen resource di SLS yang mengisolasi log berdasarkan proyek atau layanan.

  • LogStore: Unit penyimpanan untuk log.

Buat proyek

  1. Masuk ke Simple Log Service console.

  2. Klik Create Project dan konfigurasikan pengaturan berikut:

    • Region: Pilih wilayah sumber log Anda. Tidak dapat diubah setelah dibuat.

    • Project Name: Harus unik secara global dalam Alibaba Cloud. Tidak dapat diubah setelah dibuat.

    • Biarkan parameter lain pada pengaturan default dan klik Create. Parameter lain dijelaskan di Create Project.

Buat LogStore

  1. Klik nama Proyek Anda.

  2. Di panel navigasi kiri, pilih imageLog Storage, lalu klik +.

  3. Di halaman Create LogStore, konfigurasikan pengaturan inti berikut:

    • Logstore Name: Harus unik dalam Proyek. Tidak dapat diubah setelah dibuat.

    • Logstore Type: Pilih Standard atau Query berdasarkan perbandingan fitur.

    • Billing Mode:

      • Pay-by-feature: Ditagih secara terpisah untuk penyimpanan, pengindeksan, dan operasi baca/tulis. Ideal untuk penggunaan skala kecil atau tidak terprediksi.

      • Pay-by-ingested-data: Ditagih hanya untuk data mentah yang diingest. Termasuk penyimpanan gratis selama 30 hari dan pemrosesan serta pengiriman data gratis. Ideal ketika retensi sekitar 30 hari atau pipeline kompleks.

    • Data Retention Period: Retensi log dalam hari. Rentang: 1 hingga 3.650 (3.650 = permanen). Default: 30.

    • Biarkan parameter lain pada pengaturan default dan klik OK. Parameter lain dijelaskan di Manage LogStore.

Langkah 1: Suntikkan kontainer sidecar LoongCollector

Suntikkan kontainer sidecar LoongCollector ke dalam pod aplikasi Anda dengan volume bersama untuk pengumpulan log. Untuk pengujian cepat, gunakan Lampiran: contoh YAML.

1. Modifikasi konfigurasi YAML pod

  1. Definisikan volume bersama

    Di spec.template.spec.volumes, tambahkan tiga volume bersama pada level yang sama dengan containers:

    volumes:
      # Direktori log bersama (ditulis oleh kontainer aplikasi, dibaca oleh sidecar)
      - name: ${shared_volume_name} # <-- Nama harus sesuai dengan nama di volumeMounts
        emptyDir: {}
      # Direktori sinyal untuk komunikasi antar-kontainer (untuk mulai/berhenti mulus)
      - name: tasksite
        emptyDir:
          medium: Memory  # Gunakan memori sebagai medium untuk performa lebih baik
          sizeLimit: "50Mi"
      # Konfigurasi zona waktu host bersama: Menyinkronkan zona waktu untuk semua kontainer dalam pod
      - name: tz-config # <-- Nama harus sesuai dengan nama di volumeMounts
        hostPath:
          path: /usr/share/zoneinfo/Asia/Shanghai  # Ubah zona waktu sesuai kebutuhan
    
  2. Konfigurasikan pemasangan kontainer aplikasi

    Di bagian volumeMounts kontainer aplikasi Anda, seperti your-business-app-container, tambahkan pemasangan volume berikut:

    Pastikan kontainer aplikasi menulis log ke direktori ${shared_volume_path} agar LoongCollector dapat mengumpulkannya.
    volumeMounts:
      # Pasang volume log bersama ke direktori output log aplikasi
      - name: ${shared_volume_name}
        mountPath: ${shared_volume_path}  # Contoh: /var/log/app
      # Pasang direktori komunikasi
      - name: tasksite
        mountPath: /tasksite  # Direktori bersama untuk komunikasi dengan kontainer LoongCollector
      # Pasang file zona waktu
      - name: tz-config
        mountPath: /etc/localtime
        readOnly: true
    
  3. Suntikkan kontainer sidecar LoongCollector

    Di array spec.template.spec.containers, tambahkan definisi kontainer sidecar berikut:

    - name: loongcollector
      image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
      command: ["/bin/bash", "-c"]
      args:
        - |
          echo "[$(date)] LoongCollector: Starting initialization"
          # Mulai layanan LoongCollector
          /etc/init.d/loongcollectord start
          # Tunggu konfigurasi diunduh dan layanan siap
          sleep 15
          # Verifikasi status layanan
          if /etc/init.d/loongcollectord status; then
            echo "[$(date)] LoongCollector: Service started successfully"
            touch /tasksite/cornerstone
          else
            echo "[$(date)] LoongCollector: Failed to start service"
            exit 1
          fi
          # Tunggu kontainer aplikasi selesai (melalui sinyal file tombstone)
          echo "[$(date)] LoongCollector: Waiting for application container to complete"
          until [[ -f /tasksite/tombstone ]]; do
            sleep 2
          done
          # Beri waktu untuk mengunggah log tersisa
          echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
          sleep 30
          # Hentikan layanan
          echo "[$(date)] LoongCollector: Stopping service"
          /etc/init.d/loongcollectord stop
          echo "[$(date)] LoongCollector: Shutdown complete"
      # health check
      livenessProbe:
        exec:
          command: ["/etc/init.d/loongcollectord", "status"]
        initialDelaySeconds: 30
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 3
      # konfigurasi resource
      resources:
        requests:
          cpu: "100m"
          memory: "128Mi"
        limits:
          cpu: "2000m"
          memory: "2048Mi"
      # konfigurasi variabel lingkungan
      env:
        - name: ALIYUN_LOGTAIL_USER_ID
          value: "${your_aliyun_user_id}"
        - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
          value: "${your_machine_group_user_defined_id}"
        - name: ALIYUN_LOGTAIL_CONFIG
          value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
        # Aktifkan mode full drain untuk memastikan semua log dikirim sebelum pod dihentikan
        - name: enable_full_drain_mode
          value: "true"  
        # Tambahkan informasi lingkungan pod sebagai tag log
        - name: ALIYUN_LOG_ENV_TAGS
          value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
        # Secara otomatis menyuntikkan metadata pod dan node sebagai tag log
        - name: "_pod_name_"
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: "_pod_ip_"
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: "_namespace_"
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: "_node_name_"
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: "_node_ip_"
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
      # Pemasangan volume (dibagi dengan kontainer aplikasi)
      volumeMounts:
        # Pemasangan read-only untuk direktori log aplikasi
        - name: ${shared_volume_name} # <-- Nama direktori log bersama
          mountPath: ${dir_containing_your_files} # <-- Path ke direktori bersama di sidecar
          readOnly: true
        # Pasang direktori komunikasi
        - name: tasksite
          mountPath: /tasksite
        # Pasang zona waktu
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
    

2. Sesuaikan logika siklus hidup kontainer aplikasi

Bergantung pada jenis workload, modifikasi kontainer aplikasi untuk mendukung exit terkoordinasi dengan sidecar:

Tugas berumur pendek (Job/CronJob)

# 1. Tunggu LoongCollector siap
echo "[$(date)] Application: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do
  sleep 1
done
echo "[$(date)] Application: LoongCollector is ready, starting application logic"
# 2. Jalankan logika aplikasi inti (pastikan log ditulis ke direktori bersama)
echo "Hello, World!" >> /app/logs/business.log
# 3. Simpan kode exit
retcode=$?
echo "[$(date)] Application: Task completed with exit code: $retcode"
# 4. Beri tahu LoongCollector bahwa tugas aplikasi selesai
touch /tasksite/tombstone
echo "[$(date)] Application: Tombstone created, exiting"
exit $retcode

Layanan berumur panjang (Deployment / StatefulSet)

# Definisikan fungsi penanganan sinyal
_term_handler() {
    echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
    # Kirim sinyal QUIT ke Nginx untuk berhenti mulus
    if [ -n "$NGINX_PID" ]; then
        kill -QUIT "$NGINX_PID" 2>/dev/null || true
        echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
        # Tunggu Nginx berhenti secara mulus
        wait "$NGINX_PID"
        EXIT_CODE=$?
        echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
    fi
    # Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti
    echo "[$(date)] [nginx-demo] Writing tombstone file"
    touch /tasksite/tombstone
    exit $EXIT_CODE
}
# Daftarkan penanganan sinyal
trap _term_handler SIGTERM SIGINT SIGQUIT
# Tunggu LoongCollector siap
echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
until [[ -f /tasksite/cornerstone ]]; do 
    sleep 1
done
echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting application logic"
# Mulai Nginx
echo "[$(date)] [nginx-demo] Starting Nginx..."
nginx -g 'daemon off;' &
NGINX_PID=$!
echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
# Tunggu proses Nginx
wait $NGINX_PID
EXIT_CODE=$?
# Juga beri tahu LoongCollector jika exit tidak disebabkan oleh sinyal
if [ ! -f /tasksite/tombstone ]; then
    echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
    touch /tasksite/tombstone
fi
exit $EXIT_CODE

3. Atur periode tenggang terminasi

Di spec.template.spec, atur periode tenggang terminasi yang cukup lama agar LoongCollector dapat mengunggah semua log tersisa.

spec:
  # ... Konfigurasi spec lainnya ...
  template:
    spec:
      terminationGracePeriodSeconds: 600  # Periode berhenti mulus 10 menit

4. Variabel

Parameter

Deskripsi

${your_aliyun_user_id}

ID akun Alibaba Cloud Anda. Konfigurasi pengenal pengguna.

${your_machine_group_user_defined_id}

Pengenal kustom yang digunakan untuk membuat kelompok mesin. Contoh: nginx-log-sidecar.

Penting

Pastikan pengenal ini unik dalam wilayah Proyek.

${your_region_config}

Konfigurasi yang sesuai dengan wilayah dan jenis akses jaringan Proyek SLS Anda. Wilayah layanan.

Contoh: Jika Proyek Anda berada di wilayah China (Hangzhou), gunakan cn-hangzhou untuk akses jaringan internal Alibaba Cloud atau cn-hangzhou-internet untuk akses jaringan publik.

${shared_volume_name}

Nama kustom untuk volume bersama.

Penting

name di volumeMounts harus sesuai dengan name di volumes. Ini memastikan kedua kontainer memasang volume bersama yang sama.

${dir_containing_your_files}

Path pemasangan di kontainer LoongCollector tempat log teks berada.

5. Terapkan konfigurasi dan verifikasi

  1. Jalankan perintah berikut untuk menerapkan perubahan:

    kubectl apply -f <YOUR-YAML>
  2. Periksa status pod untuk memastikan kontainer LoongCollector berhasil disuntikkan:

    kubectl describe pod <YOUR-POD-NAME>

    Jika Anda melihat dua kontainer (kontainer aplikasi dan loongcollector) dengan status Running, suntikan berhasil.

Langkah 2: Buat kelompok mesin dengan pengenal kustom

Mendaftarkan instance sidecar LoongCollector ke SLS untuk manajemen konfigurasi pengumpulan terpusat.

Prosedur

  1. Buat kelompok mesin

    1. Buka proyek target. Di panel navigasi kiri, klik imageResources > Machine Groups.

    2. Di halaman Machine Groups, klik Machine group icon > Create Machine Group.

  2. Konfigurasikan kelompok mesin

    Konfigurasikan parameter berikut dan klik OK:

    • Name: Nama kelompok mesin. Tidak dapat diubah setelah dibuat. Nama harus memenuhi persyaratan berikut:

      • Hanya berisi huruf kecil, angka, tanda hubung (-), dan garis bawah (_).

      • Dimulai dan diakhiri dengan huruf kecil atau angka.

      • Panjang 2 hingga 128 karakter.

    • Machine Group Identifier: Pilih Custom Identifier.

    • Custom Identifier: Masukkan nilai variabel lingkungan ALIYUN_LOGTAIL_USER_DEFINED_ID yang Anda atur untuk kontainer LoongCollector dalam file YAML di Langkah 1. Nilai harus persis sama. Jika tidak, asosiasi akan gagal.

  3. Periksa status heartbeat kelompok mesin

    Setelah membuat kelompok mesin, klik namanya untuk memeriksa status heartbeat di bagian Status Kelompok Mesin.

    • OK: LoongCollector telah terhubung ke SLS, dan kelompok mesin terdaftar.

    • FAIL:

      • Perubahan konfigurasi mungkin memerlukan waktu hingga dua menit untuk berlaku. Muat ulang halaman dan periksa status lagi.

      • Jika status masih FAIL setelah dua menit, lihat Troubleshoot Logtail machine group issues.

Setiap pod berhubungan dengan instance LoongCollector terpisah. Untuk manajemen detail halus, gunakan pengenal kustom berbeda untuk aplikasi atau lingkungan berbeda.

Langkah 3: Buat konfigurasi pengumpulan

Konfigurasi pengumpulan menentukan file log mana yang dikumpulkan LoongCollector, cara menguraikannya, dan konten mana yang difilter.

Prosedur

  1. Di halaman image LogStore, klik image sebelum nama LogStore target untuk memperluas.

  2. Klik image di samping Data Collection. Di kotak dialog Quick Data Import, temukan kartu Kubernetes - File dan klik Integrate Now.

  3. Konfigurasikan Machine Group Configurations, lalu klik Next.

    • Scenario: Pilih Kubernetes Clusters.

    • Deployment Method: Pilih Sidecar.

    • Select Machine Group: Di daftar Source Machine Group, pilih kelompok mesin yang Anda buat di Langkah 2. Klik image untuk memindahkannya ke daftar Applied Machine Group.

  4. Di halaman Logtail Configurations, konfigurasikan aturan pengumpulan Logtail.

1. Konfigurasi global dan input

Definisikan nama, sumber log, dan cakupan pengumpulan untuk konfigurasi pengumpulan.

Global Configurations:

  • Configuration Name: Nama kustom untuk konfigurasi pengumpulan. Harus unik dalam proyeknya. Nama tidak dapat diubah setelah dibuat. Konvensi penamaan:

    • Hanya boleh berisi huruf kecil, angka, tanda hubung (-), dan garis bawah (_).

    • Harus dimulai dan diakhiri dengan huruf kecil atau angka.

Input Configurations:

  • Type: Pilih Text Log Collection.

  • Logtail Deployment Mode: Pilih Sidecar.

  • File Path Type:

    • Path in Container: Kumpulkan file log dari dalam kontainer.

    • Host Path: Kumpulkan log layanan lokal dari host.

    • dockerFile: Jika file log yang ingin Anda kumpulkan berada di dalam kontainer (lihat opsi path kontainer di atas), Anda harus mengatur dockerFile: true untuk konfigurasi pengumpulan. Jika tidak, Logtail memproses konfigurasi sebagai pengumpulan file biasa dan tidak dapat mendeteksi file log di dalam kontainer, yang mengakibatkan log hilang.

      • Console: Di Advanced Options, pilih pengumpulan file kontainer. Atau, konsol juga menyediakan titik masuk pengumpulan data terpisah Docker File - Container.

      • CRD: Atur dockerFile: true di bawah inputDetail.

  • File Path: Path untuk pengumpulan log.

    • Linux: Path harus dimulai dengan garis miring (/). Contoh, /data/mylogs/**/*.log menentukan semua file yang memiliki ekstensi .log di direktori /data/mylogs dan subdirektorinya.

    • Windows: Path harus dimulai dengan huruf drive, seperti C:\Program Files\Intel\**\*.Log.

  • Maximum Directory Monitoring Depth: Menentukan kedalaman direktori maksimum untuk karakter wildcard ** di File Path. Nilai default 0 hanya memantau direktori saat ini.

  • dockerFile: Menentukan apakah file target berada di dalam kontainer. Saat Anda mengumpulkan file log dari dalam kontainer dalam mode Sidecar, Anda harus mengatur parameter ini ke true. Jika tidak, file dikumpulkan sebagai file host biasa, yang tidak sesuai dengan perilaku pengumpulan yang diharapkan. Tipe: Boolean. Wajib: Tidak. Nilai default: false.

2. Pemrosesan dan strukturisasi log

Konfigurasikan aturan pemrosesan log untuk mengubah log mentah yang tidak terstruktur menjadi data terstruktur yang dapat dicari. Ini meningkatkan efisiensi kueri dan analisis log. Kami merekomendasikan Anda menambahkan sampel log sebelum mengonfigurasi aturan:

Di halaman Logtail Configuration, di area Processor Configurations, klik Add Sample Log dan masukkan konten log yang akan dikumpulkan. Sistem mengidentifikasi format log berdasarkan sampel dan membantu menghasilkan ekspresi reguler dan aturan penguraian, yang menyederhanakan konfigurasi.

Skenario 1: Tangani log multi-baris (seperti stack trace Java)

Log seperti stack exception Java dan objek JSON sering kali mencakup beberapa baris. Dalam mode pengumpulan default, log tersebut dipisah menjadi beberapa catatan tidak lengkap, yang menyebabkan kehilangan konteks. Untuk mencegah hal ini, Anda dapat mengaktifkan mode multi-baris dan mengonfigurasi ekspresi reguler awal-baris untuk menggabungkan baris berurutan dari log yang sama menjadi satu entri lengkap.

Contoh:

Log mentah tanpa pemrosesan

Dalam mode pengumpulan default, setiap baris diperlakukan sebagai log independen. Stack trace terpecah, dan konteks hilang.

Dengan mode multi-baris diaktifkan, ekspresi reguler awal-baris mengidentifikasi log lengkap, mempertahankan struktur semantik penuh.

2025-11-13 10:52:20.557 ERROR [app-thread-0] --- java.sql.SQLException: No suitable driver found for jdbc:mysql://db.host:3306/prod_db
    at com.datastore.util.DataProcessor.save(DataProcessor.java:434)
    at io.awesomeapp.util.PaymentGateway.fetchData(PaymentGateway.java:463)
    at org.awesomeapp.util.UserService.processRequest(UserService.java:252)
    at io.datastore.service.DatabaseConnector.fetchData(DatabaseConnector.java:172)
    at org.datastore.service.UserService.fetchData(UserService.java:517)

Dalam mode default, log ini dipisah menjadi 6 catatan independen: yang pertama hanya berisi pesan error java.sql.SQLException, sedangkan 5 frame stack sisanya (seperti at com.datastore.util.DataProcessor.save(...)) disimpan sebagai entri terpisah. Frame stack tidak dapat dikorelasikan dengan exception asli melalui kueri, sehingga memerlukan upaya manual untuk merekonstruksi konteks untuk troubleshooting.

Setelah mode multi-baris diaktifkan, log error java.sql.SQLException: No suitable driver found for jdbc:mysql://db.host:3306/prod_db beserta 5 frame stack (DataProcessor.save → UserService.fetchData) dikumpulkan sebagai satu catatan dalam layanan kueri log. Kolom metadata juga menampilkan IP, hostname, path log, dan bidang lainnya.

Prosedur: Di halaman Logtail Configuration, di area Processor Configurations, aktifkan Multi-line Mode:

  • Type: Pilih Custom atau Multi-line JSON.

    • Custom: Format log mentah tidak tetap. Anda harus mengonfigurasi Regex to Match First Line untuk mengidentifikasi baris awal setiap entri log.

      • Regex to Match First Line: Anda dapat menghasilkannya secara otomatis atau memasukkannya secara manual. Ekspresi reguler harus cocok dengan satu baris data lengkap. Contohnya, ekspresi reguler yang cocok dalam contoh sebelumnya adalah \[\d+-\d+-\w+:\d+:\d+,\d+]\s\[\w+]\s.*.

        • Generasi otomatis: Klik Generate Regex Automatically. Lalu, di kotak teks Log Sample, pilih konten log untuk diekstrak dan klik Generate Regex.

          Mode pengumpulan output standar Kubernetes lama tidak mendukung fitur Add Log Sample dan generasi ekspresi reguler otomatis. Untuk menguji ekspresi reguler, buat LogStore tipe log teks, uji ekspresi reguler di LogStore tersebut, lalu tempel ekspresi reguler ke konfigurasi Logtail LogStore target.

        • Input manual: Klik Enter Regex Manually. Setelah memasukkan ekspresi, klik Validate.

    • Multi-line JSON: Saat semua log mentah dalam format JSON standar, Simple Log Service secara otomatis menangani line break dalam satu log JSON.

  • Processing Method If Splitting Fails:

    • Discard: Jika segmen teks tidak cocok dengan aturan awal-baris, segmen tersebut dibuang.

    • Retain Single Line: Teks yang tidak cocok dipisah dan dipertahankan dalam mode single-line aslinya.

Skenario 2: Log terstruktur

Saat log mentah berupa teks tidak terstruktur atau semi-terstruktur, seperti log akses NGINX atau log output aplikasi, kueri dan analisis langsung seringkali tidak efisien. Simple Log Service menyediakan berbagai plugin penguraian data yang dapat secara otomatis mengonversi log mentah dengan format berbeda menjadi data terstruktur. Ini memberikan fondasi kuat untuk analisis, pemantauan, dan peringatan selanjutnya.

Contoh:

Log mentah tanpa pemrosesan

Log setelah penguraian terstruktur

192.168.*.* - - [15/Apr/2025:16:40:00 +0800] "GET /nginx-logo.png HTTP/1.1" 0.000 514 200 368 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.*.* Safari/537.36"
body_bytes_sent: 368
http_referer: -
http_user_agent : Mozi11a/5.0 (Nindows NT 10.0; Win64; x64) AppleMebKit/537.36 (KHTML, like Gecko) Chrome/131.0.x.x Safari/537.36
remote_addr:192.168.*.*
remote_user: -
request_length: 514
request_method: GET
request_time: 0.000
request_uri: /nginx-logo.png
status: 200
time_local: 15/Apr/2025:16:40:00

Langkah konfigurasi: Di area Processor Configurations halaman Logtail Configurations:

  1. Tambahkan plugin penguraian: Klik Add Processor, dan konfigurasikan plugin seperti plugin penguraian ekspresi reguler, delimiter, atau JSON berdasarkan format log Anda. Misalnya, untuk mengumpulkan log NGINX, pilih Native Processor > Data Parsing (NGINX Mode).

  2. NGINX Log Configuration: Salin seluruh definisi log_format dari file konfigurasi server Nginx Anda (nginx.conf) dan tempel ke kotak teks ini.

    Contoh:

    log_format main  '$remote_addr - $remote_user [$time_local] "$request" ''$request_time $request_length ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';
    Penting

    Definisi format harus persis sesuai dengan log_format di server Anda. Jika tidak, penguraian akan gagal.

  3. Deskripsi parameter konfigurasi umum: Parameter berikut umum untuk banyak plugin penguraian dan memiliki fungsi konsisten.

    • Original Field: Menentukan bidang sumber yang akan diurai. Default ke content, yaitu seluruh entri log yang dikumpulkan.

    • Retain Original Field if Parsing Fails: Direkomendasikan. Jika plugin gagal mengurai log, opsi ini mempertahankan konten log mentah di bidang aslinya.

    • Retain Original Field if Parsing Succeeds: Jika dipilih, opsi ini mempertahankan konten log mentah bahkan setelah penguraian berhasil.

3. Filtering log

Volume besar log bernilai rendah (seperti tingkat DEBUG atau INFO) membuang penyimpanan, meningkatkan biaya, mengurangi efisiensi kueri, dan menimbulkan risiko kebocoran data. Konfigurasikan kebijakan filtering untuk pengumpulan log yang efisien dan aman.

Filtering konten

Anda dapat melakukan filter berdasarkan bidang konten log, seperti hanya mengumpulkan log dengan tingkat WARNING atau ERROR.

Contoh:

Log mentah tanpa pemrosesan

Kumpulkan hanya log WARNING atau ERROR

{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
{"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}
{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}
{"level":"WARNING","timestamp":"2025-09-23T19:11:40+0800","cluster":"yilu-cluster-0728","message":"Disk space is running low","freeSpace":"15%"}
{"level":"ERROR","timestamp":"2025-09-23T19:11:42+0800","cluster":"yilu-cluster-0728","message":"Failed to connect to database","errorCode":5003}

Prosedur: Di area Processor Configurations halaman Logtail Configuration

Klik Add Processor dan pilih Native Processor > Data Filtering:

  • Field Name: Bidang log yang akan difilter.

  • Field Value: Ekspresi reguler yang digunakan untuk filtering. Hanya pencocokan teks penuh yang didukung. Pencocokan kata kunci parsial tidak didukung.

Daftar hitam pengumpulan

Anda dapat menggunakan daftar hitam untuk mengecualikan direktori atau file tertentu, yang mencegah log tidak relevan atau sensitif diunggah.

Prosedur: Di halaman Logtail Configuration, di area Input Configurations > Other Input Configurations, aktifkan Collection Blacklist dan klik Add.

Mendukung pencocokan penuh dan pencocokan wildcard untuk direktori dan nama file. Hanya karakter wildcard asterisk (*) dan tanda tanya (?) yang didukung.
  • File Path Blacklist: Path file yang akan diabaikan. Contoh:

    • /home/admin/private*.log: Mengabaikan semua file di direktori /home/admin/ yang dimulai dengan "private" dan diakhiri dengan ".log".

    • /home/admin/private*/*_inner.log: Mengabaikan file yang diakhiri dengan "_inner.log" di direktori yang dimulai dengan "private" di bawah direktori /home/admin/.

  • File Blacklist: Nama file yang akan diabaikan selama pengumpulan. Contoh:

    • app_inner.log: Mengabaikan semua file bernama app_inner.log.

  • Directory Blacklist: Path direktori tidak boleh diakhiri dengan garis miring (/). Contoh:

    • /home/admin/dir1/: Daftar hitam direktori tidak akan berlaku.

    • /home/admin/dir*: Mengabaikan file di semua subdirektori di bawah /home/admin/ yang dimulai dengan "dir".

    • /home/admin/*/dir: Mengabaikan semua file di subdirektori bernama "dir" di tingkat kedua di bawah direktori /home/admin/. Misalnya, file di direktori /home/admin/a/dir diabaikan, sedangkan file di direktori /home/admin/a/b/dir dikumpulkan.

Filtering kontainer

Atur kondisi pengumpulan berdasarkan metadata kontainer (variabel lingkungan, label Pod, namespace, nama kontainer) untuk mengontrol log kontainer mana yang dikumpulkan.

Langkah konfigurasi: Di halaman Logtail Configurations, di area Input Configurations, aktifkan Container Filtering dan klik Add.

Beberapa kondisi memiliki hubungan "AND". Semua pencocokan ekspresi reguler berdasarkan mesin ekspresi reguler RE2 Go, yang memiliki beberapa keterbatasan dibandingkan mesin seperti PCRE. Ikuti panduan di Lampiran: Batasan ekspresi reguler (filtering kontainer) saat menulis ekspresi reguler.
  • Daftar hitam/putih variabel lingkungan: Filter kontainer berdasarkan variabel lingkungannya.

  • Daftar hitam/putih label Pod K8s: Filter kontainer berdasarkan label Pod hostnya.

  • Pencocokan regex nama Pod K8s: Filter kontainer berdasarkan nama Pod-nya.

  • Pencocokan regex namespace K8s: Filter kontainer berdasarkan namespace-nya.

  • Pencocokan regex nama kontainer K8s: Filter kontainer berdasarkan namanya.

  • Daftar hitam/putih label kontainer: Filter kontainer berdasarkan labelnya. Metode ini ditujukan untuk Docker dan tidak direkomendasikan untuk Kubernetes.

4. Klasifikasi log

Saat beberapa aplikasi berbagi format log yang sama, membedakan sumber log bisa sulit. Konfigurasikan topik log dan tagging log untuk mengotomatiskan asosiasi konteks dan klasifikasi logis.

Topik log

Saat beberapa aplikasi memiliki log dengan format yang sama tetapi path berbeda (seperti /apps/app-A/run.log dan /apps/app-B/run.log), hasilkan topik untuk membedakan log dari setiap layanan.

Prosedur: Di Global Configurations > Other Global Configurations > Log Topic Type, pilih metode untuk menghasilkan topik. Tiga tipe berikut didukung:

  • Machine group topic: Saat konfigurasi pengumpulan diterapkan ke beberapa kelompok mesin, LoongCollector secara otomatis menggunakan nama kelompok mesin server sebagai bidang __topic__ untuk diunggah. Ini cocok untuk skenario di mana log dikategorikan berdasarkan host.

  • Custom: Formatnya customized://<custom_topic_name>, misalnya, customized://app-login. Ini cocok untuk skenario topik statis dengan pengenal layanan tetap.

  • File path extraction: Ekstrak informasi kunci dari path lengkap file log untuk secara dinamis menandai sumber log. Ini cocok untuk situasi di mana beberapa pengguna atau aplikasi berbagi nama file log yang sama tetapi memiliki path berbeda. Saat beberapa pengguna atau layanan menulis log ke direktori tingkat atas berbeda tetapi sub-path dan nama file sama, sumber tidak dapat dibedakan hanya berdasarkan nama file. Misalnya:

    /data/logs
    ├── userA
    │   └── serviceA
    │       └── service.log
    ├── userB
    │   └── serviceA
    │       └── service.log
    └── userC
        └── serviceA
            └── service.log

    Dalam kasus ini, Anda dapat mengonfigurasi File path extraction dan menggunakan ekspresi reguler untuk mengekstrak informasi kunci dari path lengkap. Hasil yang cocok kemudian diunggah ke Logstore sebagai topik.

    Aturan ekstraksi path file: Berdasarkan capturing groups ekspresi reguler

    Saat Anda mengonfigurasi ekspresi reguler, sistem secara otomatis menentukan format bidang output berdasarkan jumlah dan penamaan capturing groups. Aturannya sebagai berikut:

    Dalam ekspresi reguler untuk path file, Anda perlu meng-escape garis miring (/).

    Jenis capturing group

    Skenario

    Bidang yang dihasilkan

    Contoh regex

    Contoh path yang cocok

    Contoh bidang yang dihasilkan

    Single capturing group (hanya satu (.*?))

    Hanya satu dimensi yang dibutuhkan untuk membedakan sumber (seperti username, environment)

    Menghasilkan bidang __topic__

    \/logs\/(.*?)\/app\.log

    /logs/userA/app.log

    __topic__: userA

    Multiple non-named capturing groups (beberapa (.*?))

    Beberapa dimensi dibutuhkan untuk membedakan sumber, tetapi tidak memerlukan tag semantik

    Menghasilkan bidang tag __tag__:__topic_{i}__, di mana {i} adalah nomor urut capturing group

    \/logs\/(.*?)\/(.*?)\/app\.log

    /logs/userA/svcA/app.log

    __tag__:__topic_1__userA

    __tag__:__topic_2__svcA

    Multiple named capturing groups (menggunakan (?P<name>.*?))

    Beberapa dimensi dibutuhkan untuk membedakan sumber, dan Anda ingin makna bidang jelas untuk memudahkan kueri dan analisis

    Menghasilkan bidang tag __tag__:{name}

    \/logs\/(?P<user>.*?)\/(?P<service>.*?)\/app\.log

    /logs/userA/svcA/app.log

    __tag__:user:userA;

    __tag__:service:svcA

Tagging log

Aktifkan enrichment tag log untuk mengekstrak informasi kunci dari variabel lingkungan kontainer atau label Pod Kubernetes sebagai tag untuk pengelompokan log detail halus.

Langkah konfigurasi: Di area Input Configurations halaman Logtail Configurations, aktifkan Log Tag Enrichment dan klik Add.

  • Environment Variables: Konfigurasikan nama variabel lingkungan dan nama tag. Nilai variabel lingkungan disimpan sebagai nilai tag.

    • Nama Variabel Lingkungan: Nama variabel lingkungan yang akan diekstrak.

    • Nama Tag: Nama tag.

  • Pod Labels: Konfigurasikan nama label Pod dan nama tag. Nilai label Pod disimpan sebagai nilai tag.

    • Nama Label Pod: Nama label Pod Kubernetes yang akan diekstrak.

    • Nama Tag: Nama tag.

5. Konfigurasi output

Secara default, semua log dikirim ke LogStore saat ini dengan kompresi lz4. Untuk mendistribusikan log ke beberapa LogStore, konfigurasikan tujuan output tambahan.

Distribusi multi-tujuan dinamis

Penting
  • Distribusi multi-tujuan hanya tersedia untuk LoongCollector 3.0.0 ke atas. Fitur ini tidak didukung oleh Logtail.

  • Anda dapat mengonfigurasi maksimal lima tujuan output.

  • Setelah mengonfigurasi beberapa tujuan output, konfigurasi pengumpulan tidak lagi muncul di daftar konfigurasi pengumpulan untuk LogStore saat ini. Untuk melihat, memodifikasi, atau menghapus konfigurasi distribusi multi-tujuan, lihat Manage multi-destination distribution configurations.

Langkah konfigurasi: Di area Output Configurations halaman Logtail Configurations.

  1. Klik image untuk memperluas konfigurasi output.

  2. Klik Add Output Targets dan lengkapi konfigurasi berikut:

    • Logstores: Pilih LogStore tujuan.

    • Compression Method: lz4 dan zstd didukung.

    • Route Settings: Rute log berdasarkan bidang tag. Sistem mengunggah log yang cocok ke LogStore tujuan. Jika konfigurasi ini kosong, sistem mengunggah semua log yang dikumpulkan ke tujuan ini.

      • Tag Name: Nama bidang tag yang digunakan untuk routing. Masukkan hanya nama bidang (misalnya, __path__), tanpa awalan __tag__:. Bidang tag terbagi menjadi dua kategori:

        Tag dijelaskan di Manage LoongCollector collection tags.
        • Terkait Agen: Terkait agen pengumpulan dan independen dari plugin. Contoh termasuk __hostname__ dan __user_defined_id__.

        • Terkait Plugin Input: Disediakan oleh plugin input untuk memperkaya log dengan informasi kontekstual. Contoh termasuk __path__ untuk pengumpulan file dan _pod_name_ atau _container_name_ untuk pengumpulan Kubernetes.

      • Tag Value: Jika bidang tag log cocok dengan nilai ini, sistem mengirim log ke LogStore tujuan ini.

      • Discard this tag?: Jika diaktifkan, sistem menghapus bidang tag ini dari log sebelum mengunggahnya.

Langkah 4: Konfigurasi kueri dan analisis

Setelah Anda mengonfigurasi pemrosesan log dan plugin, klik Next untuk menuju halaman Query and Analysis Configurations:

  • Sistem mengaktifkan full-text index secara default, yang memungkinkan Anda melakukan pencarian kata kunci pada konten log asli.

  • Untuk melakukan kueri tepat berdasarkan bidang, tunggu Preview Data dimuat di halaman, lalu klik Automatic Index Generation. Simple Log Service menghasilkan field index berdasarkan entri pertama dalam data pratinjau.

Setelah konfigurasi selesai, klik Next untuk menyelesaikan konfigurasi pengumpulan.

Langkah 5: Lihat log yang diunggah

Setelah Anda membuat konfigurasi pengumpulan dan menerapkannya ke kelompok mesin, konfigurasi tersebut diterapkan secara otomatis dan mulai mengumpulkan log inkremental.

  1. Verifikasi entri log baru: LoongCollector hanya mengumpulkan log inkremental. Jalankan tail -f /path/to/your/log/file dan gunakan aplikasi Anda untuk menghasilkan entri log baru.

  2. Kueri log: Buka halaman Search & Analyze LogStore target dan klik Search & Analyze. Rentang waktu default adalah 15 menit terakhir. Periksa apakah log baru muncul. Bidang default untuk log teks kontainer adalah sebagai berikut:

    Parameter

    Deskripsi

    tag:hostname

    Nama host kontainer.

    tag:path

    Path file log di dalam kontainer.

    tag:container_ip

    Alamat IP kontainer.

    tag:image_name

    Nama image yang digunakan oleh kontainer.

    Catatan

    Jika beberapa image memiliki hash yang sama tetapi nama atau tag berbeda, konfigurasi pengumpulan memilih salah satu nama berdasarkan hash. Nama yang dipilih tidak dijamin sesuai dengan yang didefinisikan dalam file YAML.

    tag:pod_name

    Nama pod.

    tag:namespace

    Namespace tempat pod berada.

    tag:pod_uid

    Pengenal unik (UID) pod.

Konfigurasi utama untuk integritas log

Parameter konfigurasi ini secara langsung memengaruhi integritas dan keandalan pengumpulan log.

Konfigurasi resource LoongCollector

Alokasi resource yang tepat sangat penting untuk performa pengumpulan dalam skenario volume tinggi. Parameter utama:

# Konfigurasikan resource CPU dan memori berdasarkan laju pembuatan log
resources:
  limits:
    cpu: "2000m"       
    memory: "2Gi"
# Parameter yang memengaruhi performa pengumpulan
env:
  - name: cpu_usage_limit
    value: "2"      
  - name: mem_usage_limit
    value: "2048"  
  - name: max_bytes_per_sec
    value: "209715200"
  - name: process_thread_count
    value: "8"                             
  - name: send_request_concurrency
    value: "20"                            

Untuk mengonfigurasi Logtail berdasarkan volume data Anda, lihat Logtail network types, startup parameters, and configuration files.

Konfigurasi kuota sisi server

Batas kuota sisi server atau masalah jaringan dapat memblokir transmisi data, menciptakan tekanan balik yang memengaruhi integritas log. Gunakan CloudLens for SLS untuk memantau kuota resource Project.

Optimasi konfigurasi pengumpulan awal

Kebijakan pengumpulan file awal saat startup pod memengaruhi integritas log, terutama dalam skenario throughput tinggi.

Ukuran pengumpulan awal menentukan di mana pengumpulan dimulai dalam file baru. Default: 1024 KB.

  • Jika file lebih kecil dari 1024 KB, pengumpulan dimulai dari awal.

  • Jika file lebih besar dari 1024 KB, pengumpulan dimulai 1024 KB dari akhir.

  • Ukuran pengumpulan awal dapat berkisar dari 0 hingga 10.485.760 KB (10 GB).

enable_full_drain_mode

Memastikan LoongCollector menyelesaikan semua pengumpulan dan transmisi data sebelum dihentikan setelah menerima sinyal SIGTERM.

# Parameter yang memengaruhi integritas pengumpulan
env:
  - name: enable_full_drain_mode
    value: "true"                          # Aktifkan mode full drain

FAQ

Manage multi-destination distribution configurations

Konfigurasi distribusi multi-tujuan berlaku untuk beberapa LogStore dan harus dikelola di tingkat Project:

  1. Masuk ke Konsol Log Service, lalu klik nama Project tujuan.

  2. Di halaman Project target, di panel navigasi kiri, klik imageResources > Configurations.

    Catatan

    Halaman ini mengelola terpusat semua konfigurasi pengumpulan dalam Project, termasuk yang tersisa setelah LogStore dihapus.

Langkah selanjutnya

  1. Visualisasi data: Gunakan dasbor visualisasi untuk memantau tren metrik utama.

  2. Peringatan otomatis untuk anomali data: Siapkan kebijakan peringatan untuk mendeteksi anomali sistem secara real time.

  3. SLS hanya mengumpulkan log inkremental. Untuk mengumpulkan log historis, lihat Import historical log files.

Lampiran: Contoh YAML

Konfigurasi Kubernetes lengkap dengan kontainer aplikasi Nginx dan kontainer sidecar LoongCollector.

Sebelum menggunakan konfigurasi ini, ganti placeholder berikut:

  1. Ganti ${your_aliyun_user_id} dengan ID akun Alibaba Cloud Anda.

  2. Ganti ${your_machine_group_user_defined_id} dengan pengenal kustom kelompok mesin yang Anda buat di Langkah 3 . Nilai harus persis sama.

  3. Ganti ${your_region_config} dengan nama konfigurasi yang sesuai dengan wilayah dan jenis jaringan proyek SLS Anda.

    Contoh: Jika proyek Anda berada di wilayah China (Hangzhou), gunakan cn-hangzhou untuk akses jaringan internal atau cn-hangzhou-internet untuk akses jaringan publik.

Tugas berumur pendek (Job/CronJob)

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
spec:
  backoffLimit: 3                   
  activeDeadlineSeconds: 3600        
  completions: 1                     
  parallelism: 1                    
  template:
    spec:
      restartPolicy: Never         
      terminationGracePeriodSeconds: 300 
      containers:
        # Kontainer aplikasi
        - name: demo-job
          image: debian:bookworm-slim
          command: ["/bin/bash", "-c"]
          args:
            - |
              # Tunggu LoongCollector siap.
              echo "[$(date)] Business: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] Business: LoongCollector is ready, starting business logic"
              # Jalankan logika aplikasi.
              echo "Hello, World!" >> /app/logs/business.log
              # Simpan kode exit.
              retcode=$?
              echo "[$(date)] Business: Task completed with exit code: $retcode"
              # Beri tahu LoongCollector bahwa tugas selesai.
              touch /tasksite/tombstone
              echo "[$(date)] Business: Tombstone created, exiting"
              exit $retcode
          # Permintaan dan batas resource
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500"
              memory: "512Mi"
          # pemasangan volume
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
            - name: tasksite
              mountPath: /tasksite
        # Kontainer sidecar LoongCollector
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-hongkong.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              # Mulai layanan LoongCollector.
              /etc/init.d/loongcollectord start
              # Tunggu konfigurasi diunduh dan layanan siap.
              sleep 15
              # Verifikasi status layanan.
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              # Tunggu kontainer aplikasi selesai.
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # Beri waktu cukup untuk mengirim log tersisa.
              sleep 30
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              echo "[$(date)] LoongCollector: Shutdown complete"
          # health check
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          # Permintaan dan batas resource
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          # variabel lingkungan
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "your-user-id"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "your-user-defined-id"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/cn-hongkong/ilogtail_config.json"
            - name: ALIYUN_LOG_ENV_TAGS
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_"
            # Suntikkan metadata pod.
            - name: "_pod_name_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "_pod_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "_namespace_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: "_node_name_"
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
          # pemasangan volume
          volumeMounts:
            - name: app-logs
              mountPath: /app/logs
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      # Definisi volume
      volumes:
        - name: app-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "10Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

Layanan berumur panjang (Deployment / StatefulSet)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
  namespace: production
  labels:
    app: nginx-demo
    version: v1.0.0
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1      
      maxSurge: 1          
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
        version: v1.0.0    
    spec:
      terminationGracePeriodSeconds: 600  # Periode shutdown mulus 10 menit
      containers:
        # Kontainer aplikasi - Aplikasi web
        - name: nginx-demo
          image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6          
          # Perintah startup dan penanganan sinyal
          command: ["/bin/sh", "-c"]
          args:
            - |
              # Definisikan penanganan sinyal.
              _term_handler() {
                  echo "[$(date)] [nginx-demo] Caught SIGTERM, starting graceful shutdown..."
                  # Kirim sinyal QUIT ke Nginx untuk berhenti mulus.
                  if [ -n "$NGINX_PID" ]; then
                      kill -QUIT "$NGINX_PID" 2>/dev/null || true
                      echo "[$(date)] [nginx-demo] Sent SIGQUIT to Nginx PID: $NGINX_PID"
                      # Tunggu Nginx berhenti secara mulus.
                      wait "$NGINX_PID"
                      EXIT_CODE=$?
                      echo "[$(date)] [nginx-demo] Nginx stopped with exit code: $EXIT_CODE"
                  fi
                  # Beri tahu LoongCollector bahwa kontainer aplikasi telah berhenti.
                  echo "[$(date)] [nginx-demo] Writing tombstone file"
                  touch /tasksite/tombstone
                  exit $EXIT_CODE
              }
              # Daftarkan penanganan sinyal.
              trap _term_handler SIGTERM SIGINT SIGQUIT
              # Tunggu LoongCollector siap.
              echo "[$(date)] [nginx-demo]: Waiting for LoongCollector to be ready..."
              until [[ -f /tasksite/cornerstone ]]; do 
                sleep 1
              done
              echo "[$(date)] [nginx-demo]: LoongCollector is ready, starting business logic"
              # Mulai Nginx.
              echo "[$(date)] [nginx-demo] Starting Nginx..."
              nginx -g 'daemon off;' &
              NGINX_PID=$!
              echo "[$(date)] [nginx-demo] Nginx started with PID: $NGINX_PID"
              # Tunggu proses Nginx keluar.
              wait $NGINX_PID
              EXIT_CODE=$?
              # Jika proses keluar tanpa sinyal, beri tahu LoongCollector.
              if [ ! -f /tasksite/tombstone ]; then
                  echo "[$(date)] [nginx-demo] Unexpected exit, writing tombstone"
                  touch /tasksite/tombstone
              fi
              exit $EXIT_CODE
          # Permintaan dan batas resource
          resources:
            requests:
              cpu: "200m"
              memory: "256Mi"
            limits:
              cpu: "1000m"
              memory: "1Gi"
          # pemasangan volume
          volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
        # Kontainer sidecar LoongCollector
        - name: loongcollector
          image: aliyun-observability-release-registry.cn-shenzhen.cr.aliyuncs.com/loongcollector/loongcollector:v3.1.1.0-20fa5eb-aliyun
          command: ["/bin/bash", "-c"]
          args:
            - |
              echo "[$(date)] LoongCollector: Starting initialization"
              # Mulai layanan LoongCollector.
              /etc/init.d/loongcollectord start
              # Tunggu konfigurasi diunduh dan layanan siap.
              sleep 15
              # Verifikasi status layanan.
              if /etc/init.d/loongcollectord status; then
                echo "[$(date)] LoongCollector: Service started successfully"
                touch /tasksite/cornerstone
              else
                echo "[$(date)] LoongCollector: Failed to start service"
                exit 1
              fi
              # Tunggu kontainer aplikasi selesai.
              echo "[$(date)] LoongCollector: Waiting for business container to complete"
              until [[ -f /tasksite/tombstone ]]; do 
                sleep 2
              done
              echo "[$(date)] LoongCollector: Business completed, waiting for log transmission"
              # Beri waktu cukup untuk mengirim log tersisa.
              sleep 30
              echo "[$(date)] LoongCollector: Stopping service"
              /etc/init.d/loongcollectord stop
              echo "[$(date)] LoongCollector: Shutdown complete"
          # health check
          livenessProbe:
            exec:
              command: ["/etc/init.d/loongcollectord", "status"]
            initialDelaySeconds: 30
            periodSeconds: 10
            timeoutSeconds: 5
            failureThreshold: 3
          # Permintaan dan batas resource
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "2000m"
              memory: "2048Mi"
          # variabel lingkungan
          env:
            - name: ALIYUN_LOGTAIL_USER_ID
              value: "${your_aliyun_user_id}"
            - name: ALIYUN_LOGTAIL_USER_DEFINED_ID
              value: "${your_machine_group_user_defined_id}"
            - name: ALIYUN_LOGTAIL_CONFIG
              value: "/etc/ilogtail/conf/${your_region_config}/ilogtail_config.json"
            # Aktifkan mode full drain untuk mengirim semua log saat pod berhenti.
            - name: enable_full_drain_mode
              value: "true"
            # Tambahkan informasi lingkungan pod sebagai tag log.
            - name: "ALIYUN_LOG_ENV_TAGS"
              value: "_pod_name_|_pod_ip_|_namespace_|_node_name_|_node_ip_"
            # Dapatkan informasi pod dan node.
            - name: "_pod_name_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "_pod_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "_namespace_"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: "_node_name_"
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: "_node_ip_"
              valueFrom:
                fieldRef:
                  fieldPath: status.hostIP
          # pemasangan volume
          volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx
              readOnly: true
            - name: tasksite
              mountPath: /tasksite
            - name: tz-config
              mountPath: /etc/localtime
              readOnly: true
      # Definisi volume
      volumes:
        - name: nginx-logs
          emptyDir: {}
        - name: tasksite
          emptyDir:
            medium: Memory
            sizeLimit: "50Mi"
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai

Lampiran: Prosesor native

Di halaman Logtail Configuration, di area Processor Configurations, Anda dapat menambahkan plugin pemrosesan untuk menstrukturisasi log mentah. Untuk menambahkan plugin pemrosesan ke konfigurasi pengumpulan yang ada, ikuti langkah-langkah berikut:

  1. Di panel navigasi kiri, pilih imageLogstores dan temukan Logstore tujuan.

  2. Klik image di sebelah kiri namanya untuk memperluas Logstore.

  3. Klik Logtail Configuration. Di daftar konfigurasi, temukan konfigurasi Logtail tujuan dan klik Manage Logtail Configuration di kolom Actions.

  4. Di halaman konfigurasi Logtail, klik Edit.

Bagian ini hanya memperkenalkan plugin pemrosesan yang umum digunakan yang mencakup skenario pemrosesan log umum. Untuk fitur lebih lanjut, lihat Extension processing plug-ins.
Penting

Aturan menggabungkan plugin (berlaku untuk LoongCollector / Logtail 2.0 ke atas):

  • Plugin pemrosesan native dan ekstensi dapat digunakan secara independen atau dikombinasikan sesuai kebutuhan.

  • Kami merekomendasikan Anda menggunakan plugin pemrosesan native terlebih dahulu, karena menawarkan performa lebih baik dan stabilitas lebih tinggi.

  • Saat fitur native tidak dapat memenuhi kebutuhan bisnis, Anda dapat menambahkan plugin pemrosesan ekstensi setelah plugin native yang dikonfigurasi untuk melakukan pemrosesan tambahan.

Batasan urutan:

Semua plugin dijalankan secara berurutan sesuai urutan konfigurasinya, yang membentuk rantai pemrosesan. Catatan: Semua plugin pemrosesan native harus mendahului plugin pemrosesan ekstensi apa pun. Setelah Anda menambahkan plugin pemrosesan ekstensi, Anda tidak dapat menambahkan plugin pemrosesan native lagi.

Penguraian regex

Gunakan ekspresi reguler untuk mengekstrak bidang dari log menjadi pasangan kunci-nilai untuk kueri dan analisis independen.

Contoh:

Log mentah tanpa pemrosesan

Menggunakan plugin penguraian ekspresi reguler

127.0.0.1 - - [16/Aug/2024:14:37:52 +0800] "GET /wp-admin/admin-ajax.php?action=rest-nonce HTTP/1.1" 200 41 "http://www.example.com/wp-admin/post-new.php?post_type=page" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
body_bytes_sent: 41
http_referer: http://www.example.com/wp-admin/post-new.php?post_type=page
http_user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; ×64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
remote_addr: 127.0.0.1
remote_user: -
request_method: GET
request_protocol: HTTP/1.1
request_uri: /wp-admin/admin-ajax.php?action=rest-nonce
status: 200
time_local: 16/Aug/2024:14:37:52 +0800

Prosedur: Di bagian Processor Configurations halaman Logtail Configurations, klik Add Processor dan pilih Native Processor > Data Parsing (Regex Mode).

  • Regular Expression: Ekspresi reguler untuk mencocokkan konten log. Anda dapat menghasilkannya secara otomatis atau memasukkannya secara manual.

    • Hasilkan otomatis:

      • Klik Generate.

      • Di kotak Log Sample, pilih konten log untuk diekstrak.

      • Klik Generate Regular Expression.

        Sebagai contoh, jika Anda menempelkan log dalam format Apache Combined ke kotak Log Sample, log tersebut akan berisi bidang seperti IP klien, timestamp, metode dan path permintaan, kode status, Referer, dan User-Agent.

    • Input manual: Manually Enter Regular Expression berdasarkan format log.

    Setelah memasukkan ekspresi, klik Validate untuk menguji apakah ekspresi tersebut mengurai konten log dengan benar.

  • Extracted Field: Atur nama bidang (kunci) untuk setiap bagian konten log yang diekstrak (nilai).

  • Untuk informasi tentang parameter lain, lihat deskripsi parameter umum di Use case 2: Structured logs.


Penguraian delimiter

Gunakan penguraian delimiter untuk memisah konten log menjadi pasangan kunci-nilai. Mendukung delimiter karakter tunggal dan multi-karakter.

Contoh:

Log mentah tanpa pemrosesan

Pisahkan bidang dengan karakter yang ditentukan ,

05/May/2025:13:30:28,10.10.*.*,"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1",200,18204,aliyun-sdk-java
ip:10.10.*.*
request:POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=****************&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=******************************** HTTP/1.1
size:18204
status:200
time:05/May/2025:13:30:28
user_agent:aliyun-sdk-java

Prosedur: Di bagian Processor Configurations halaman Logtail Configurations, klik Add Processor dan pilih Native Processor > Data Parsing (Delimiter Mode).

  • Delimiter: Karakter yang digunakan untuk memisah konten log.

    Contoh: Untuk file CSV, pilih Custom dan masukkan koma (,).

  • Quote: Saat nilai bidang berisi delimiter, Anda harus menentukan karakter quote untuk membungkus bidang guna mencegah pemisahan salah.

  • Extracted Field: Tetapkan nama bidang (kunci) untuk setiap kolom secara berurutan. Nama bidang harus memenuhi aturan berikut:

    • Hanya boleh berisi huruf, angka, dan garis bawah (_).

    • Harus dimulai dengan huruf atau garis bawah (_).

    • Panjang maksimal 128 byte.

  • Untuk informasi tentang parameter lain, lihat deskripsi parameter umum di Use case 2: Structured logs.


Penguraian JSON

Mengurai log yang diformat sebagai objek JSON menjadi pasangan kunci-nilai.

Contoh:

Log mentah tanpa pemrosesan

Ekstraksi otomatis kunci-nilai JSON standar

{"url": "POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek********&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1", "ip": "10.200.98.220", "user-agent": "aliyun-sdk-java", "request": {"status": "200", "latency": "18204"}, "time": "05/Jan/2025:13:30:28"}
ip: 10.200.98.220
request: {"status": "200", "latency" : "18204" }
time: 05/Jan/2025:13:30:28
url: POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0Ujpek******&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1
user-agent:aliyun-sdk-java

Prosedur: Di bagian Processor Configurations halaman Logtail Configurations, klik Add Processor dan pilih Native Processor > Data Parsing (JSON Mode).

  • Original Field: Nilai default adalah content. Bidang ini berisi log mentah yang akan diurai.

  • Untuk informasi tentang parameter lain, lihat deskripsi parameter umum di Use case 2: Structured logs.


Memperluas bidang JSON

Memperluas bidang yang berisi objek JSON bersarang menjadi beberapa pasangan kunci-nilai.

Contoh:

Log mentah tanpa pemrosesan

Kedalaman ekspansi: 0, menggunakan kedalaman ekspansi sebagai awalan

Kedalaman ekspansi: 1, menggunakan kedalaman ekspansi sebagai awalan

{"s_key":{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}}
0_s_key_k1_k2_k3_k41:41
0_s_key_k1_k2_k3_k4_k51:51
0_s_key_k1_k2_k3_k4_k52:52
1_s_key:{"k1":{"k2":{"k3":{"k4":{"k51":"51","k52":"52"},"k41":"41"}}}}

Prosedur: Di bagian Processor Configurations halaman Logtail Configurations, klik Add Processor dan pilih Extended Processor > Expand JSON Field.

  • Original Field: Nama bidang asli yang akan diperluas, misalnya, content.

  • JSON Expansion Depth: Tingkat ekspansi objek JSON. Nilai 0 (default) memperluas objek sepenuhnya, 1 hanya memperluas level saat ini, dan seterusnya.

  • Character to Concatenate Expanded Keys: Karakter yang digunakan untuk menggabungkan nama bidang selama ekspansi JSON. Default adalah garis bawah (_).

  • Name Prefix of Expanded Keys: Awalan yang ditambahkan ke nama bidang setelah ekspansi JSON.

  • Expand Array: Aktifkan sakelar ini untuk memperluas array menjadi pasangan kunci-nilai dengan indeks.

    Contoh: {"k":["a","b"]} diperluas menjadi  k[0]: "a", k[1]: "b".

    Untuk mengganti nama bidang yang diperluas (misalnya, dari prefix_s_key_k1 menjadi new_field_name), tambahkan prosesor Rename Fields untuk menyelesaikan pemetaan.
  • Untuk informasi tentang parameter lain, lihat deskripsi parameter umum di Use case 2: Structured logs.


Penguraian array JSON

Gunakan fungsi json_extract untuk mengekstrak objek JSON dari array JSON.

Contoh:

Log mentah tanpa pemrosesan

Ekstrak struktur array JSON

[{"key1":"value1"},{"key2":"value2"}]
json1:{"key1":"value1"}
json2:{"key2":"value2"}

Prosedur: Di halaman Logtail Configuration, di area Processor Configurations, ubah Processing Method ke SPL, konfigurasikan SPL Statement, dan gunakan fungsi json_extract untuk mengekstrak objek JSON dari array JSON.

Contoh: Ekstrak elemen dari array JSON di bidang log content dan simpan hasilnya di bidang baru json1 dan json2.

* | extend json1 = json_extract(content, '$[0]'), json2 = json_extract(content, '$[1]')

Penguraian log Apache

Strukturisasi konten log berdasarkan definisi dalam file konfigurasi log Apache Anda, menguraikannya menjadi beberapa pasangan kunci-nilai.

Contoh:

Log mentah tanpa pemrosesan

Format Log Umum Apache combined penguraian

1 192.168.1.10 - - [08/May/2024:15:30:28 +0800] "GET /index.html HTTP/1.1" 200 1234 "https://www.example.com/referrer" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36"
http_referer:https://www.example.com/referrer
http_user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.X.X Safari/537.36
remote_addr:192.168.1.10
remote_ident:-
remote_user:-
request_method:GET
request_protocol:HTTP/1.1
request_uri:/index.html
response_size_bytes:1234
status:200
time_local:[08/May/2024:15:30:28 +0800]

Prosedur: Di bagian Processor Configurations halaman Logtail Configurations, klik Add Processor dan pilih Native Processor > Data Parsing (Apache Mode).

  • Log Format: combined

  • APACHE LogFormat Configuration: Sistem secara otomatis mengisi bidang ini berdasarkan Log Format yang dipilih.

    Penting

    Pastikan konten yang diisi otomatis persis sesuai dengan definisi LogFormat dalam file konfigurasi Apache server Anda (biasanya /etc/apache2/apache2.conf).

  • Untuk informasi tentang parameter lain, lihat deskripsi parameter umum di Use case 2: Structured logs.


Masking data

Mask data sensitif dalam log.

Contoh:

Log mentah tanpa pemrosesan

Hasil masking

[{'account':'1812213231432969','password':'04a23f38'}, {'account':'1812213685634','password':'123a'}]
[{'account':'1812213231432969','password':'********'}, {'account':'1812213685634','password':'********'}]

Prosedur: Di halaman Logtail Configuration, di area Processor Configurations, klik Add Processor dan pilih Native Processor > Data Masking:

  • Original Field: Bidang sumber yang berisi konten log sebelum penguraian.

  • Data Masking Method:

    • const: Mengganti konten sensitif dengan string yang ditentukan.

    • md5: Mengganti konten sensitif dengan Hash MD5-nya.

  • Replacement String: Saat Anda memilih const untuk Data Masking Method, Anda perlu memasukkan string untuk mengganti konten sensitif.

  • Content Expression that Precedes Replaced Content: Digunakan untuk menemukan konten sensitif. Konfigurasikan menggunakan sintaks RE2.

  • Content Expression to Match Replaced Content: Ekspresi untuk konten sensitif. Konfigurasikan menggunakan sintaks RE2.


Penguraian waktu

Mengurai bidang waktu dalam log dan mengatur hasil penguraian sebagai bidang __time__ log.

Contoh:

Log mentah tanpa pemrosesan

Penguraian waktu

{"level":"INFO","timestamp":"2025-09-23T19:11:47+0800","cluster":"yilu-cluster-0728","message":"User logged in successfully","userId":"user-123"}

Di tampilan detail log SLS, log JSON diurai dengan benar menjadi bidang terstruktur. Setiap bidang (cluster, level, message, time, userId) dan nilainya ditampilkan secara independen.

Prosedur: Di halaman Logtail Configuration, di area Processor Configurations, klik Add Processor dan pilih Native Processor > Time Parsing:

  • Original Field: Bidang sumber yang berisi konten log sebelum penguraian.

  • Time Format: Atur format waktu yang sesuai berdasarkan konten waktu dalam log.

  • Time Zone: Pilih zona waktu bidang waktu log. Secara default, menggunakan zona waktu mesin, yaitu zona waktu lingkungan tempat proses LoongCollector (Logtail) berjalan.

Batasan ekspresi reguler untuk filtering kontainer

Ekspresi reguler untuk filtering kontainer menggunakan mesin Go RE2, yang memiliki batasan sintaks dibandingkan PCRE.

1. Perbedaan sintaks grup bernama

Go menggunakan sintaks (?P<name>...) untuk mendefinisikan grup bernama dan tidak mendukung sintaks (?<name>...) dari PCRE.

  • Sintaks benar: (?P<year>\d{4})

  • Sintaks salah: (?<year>\d{4})

2. Fitur ekspresi reguler yang tidak didukung

Mesin RE2 tidak mendukung fitur ekspresi reguler umum berikut yang kompleks:

  • Assertions: (?=...), (?!...), (?<=...), dan (?<!...)

  • Conditional expressions: (?(condition)true|false)

  • Recursive matching: (?R) dan (?0)

  • Subprogram references: (?&name) dan (?P>name)

  • Atomic groups: (?>...)

3. Rekomendasi

Gunakan alat seperti Regex101 untuk men-debug ekspresi reguler. Pilih mode Golang (RE2) untuk memastikan kompatibilitas. Sintaks yang tidak didukung mencegah penguraian atau pencocokan yang benar.