All Products
Search
Document Center

Simple Log Service:Analisis log akses Nginx

Last Updated:Jun 04, 2026

Simple Log Service mendukung analisis multidimensi terhadap log akses Nginx. Topik ini mencakup analisis traffic website, diagnosis latensi, dan konfigurasi alert dengan contoh kueri.

Prasyarat

Log akses Nginx telah dikumpulkan. Kumpulkan log teks menggunakan mode konfigurasi Nginx.

Wizard impor data secara otomatis menghasilkan indeks berdasarkan field log. Untuk memodifikasi indeks, ikuti Buat indeks.

Ikhtisar

Log Nginx sangat penting untuk operasional website. Pendekatan tradisional seperti CNZZ memerlukan injeksi JavaScript di frontend, sedangkan komputasi stream atau offline membutuhkan infrastruktur kompleks dan mengorbankan performa real-time atau fleksibilitas analitis.

Simple Log Service mengumpulkan log Nginx melalui wizard impor data dan secara otomatis membuat indeks serta dasbor. Dasbor nginx_Nginx access log menampilkan distribusi IP sumber, status permintaan, user agent, tren PV/UV, statistik traffic, referrer teratas, dan URL yang paling sering diakses. Anda dapat menulis kueri kustom untuk menganalisis latensi dan mengonfigurasi alert untuk error atau anomali traffic.

Analisis traffic website

  1. Masuk ke Konsol Simple Log Service.

  2. Pada bagian Projects, klik proyek yang diinginkan.

    image

  3. Di panel navigasi sebelah kiri, pilih Log Storage > Logstores. Klik ikon > di sebelah kiri Logstore yang diinginkan.

  4. Di bawah Dashboard, klik nginx_Nginx access log.

    Dasbor nginx_Nginx access log mencakup grafik-grafik berikut:

    • Grafik Distribusi alamat IP sumber menunjukkan distribusi geografis IP permintaan selama satu hari terakhir. Kueri:

      * | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100
    • Grafik Distribusi status permintaan menunjukkan persentase setiap kode status HTTP selama satu hari terakhir. Kueri:

       * | select count(1) as pv,
               status
               group by status

      Nginx access logs - request status distribution

    • Grafik Distribusi metode permintaan menunjukkan persentase setiap metode permintaan selama satu hari terakhir. Kueri:

      * | select count(1) as pv ,request_method group by request_method

      Nginx access logs - request method distribution

    • Grafik Distribusi user agent menunjukkan persentase browser yang berbeda selama satu hari terakhir. Kueri:

      * | select count(1) as pv, case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end as http_user_agent  group by case when http_user_agent like '%Chrome%' then 'Chrome' when http_user_agent like '%Firefox%' then 'Firefox' when http_user_agent like '%Safari%' then 'Safari' else 'unKnown' end   order by pv desc limit 10

      Nginx access logs - user agent distribution

    • Grafik 10 referrer teratas menunjukkan 10 halaman referrer teratas berdasarkan PV selama satu hari terakhir. Kueri:

      * | select count(1) as pv , http_referer  group by http_referer order by pv desc limit 10

      Nginx access logs - top 10 referrers

    • Grafik Statistik traffic inbound dan outbound menunjukkan traffic inbound dan outbound selama satu hari terakhir. Kueri:

      * | select sum(body_bytes_sent) as net_out, sum(request_length) as net_in ,date_format(date_trunc('hour', __time__), '%m-%d %H:%i')  as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i') order by time limit 10000

      Traffic statistics

    • Grafik PV/UV statistics menampilkan jumlah PV dan UV dalam satu hari terakhir. Kueri:

      *| select approx_distinct(remote_addr) as uv ,count(1) as pv , date_format(date_trunc('hour', __time__), '%m-%d %H:%i')  as time group by date_format(date_trunc('hour', __time__), '%m-%d %H:%i')  order by time limit 1000

      Nginx access logs - PV/UV statistics

    • Grafik PV forecast memprediksi PV untuk empat jam ke depan. Kueri:

      * | select ts_predicate_simple(stamp, value, 6, 1, 'sum') from (select __time__ - __time__ % 60 as stamp, COUNT(1) as value from log GROUP BY stamp order by stamp) LIMIT 1000

      PV forecast

    • Grafik 10 URL yang paling sering diakses menunjukkan 10 URL dengan permintaan terbanyak berdasarkan PV selama satu hari terakhir. Kueri:

      * | select count(1) as pv, split_part(request_uri,'?',1) as path  group by path order by pv desc limit 10

Diagnosis dan optimalkan performa website

Pantau latensi permintaan untuk mengidentifikasi halaman yang lambat. Gunakan kueri kustom untuk menganalisis pola latensi. Untuk sintaks kueri, lihat Panduan cepat untuk pencarian dan analisis.

  • Hitung latensi permintaan rata-rata dan maksimum setiap 5 menit untuk memahami tren latensi secara keseluruhan.

      * | select from_unixtime(__time__ -__time__% 300) as time, 
              avg(request_time) as avg_latency ,
              max(request_time) as max_latency  
              group by __time__ -__time__% 300
  • Identifikasi halaman dengan latensi tertinggi untuk diprioritaskan dalam optimasi.

      * | select from_unixtime(__time__ - __time__% 60) , 
              max_by(request_uri,request_time)  
              group by __time__ - __time__%60
  • Kelompokkan nilai latensi ke dalam 10 bin untuk menganalisis distribusinya.

    * |select numeric_histogram(10,request_time)
  • Ambil 10 nilai latensi tertinggi beserta permintaan yang sesuai.

    * | select max(request_time,10)
  • Optimalkan halaman dengan latensi tertinggi.

    Misalnya, jika /url2 memiliki latensi tertinggi, optimalkan halaman /url2 dengan menghitung PV, UV, metode permintaan, kode status, browser, latensi rata-rata, dan latensi maksimum untuk /url2.

       request_uri:"/url2" | select count(1) as pv,
              approx_distinct(remote_addr) as uv,
              histogram(method) as method_pv,
              histogram(status) as status_pv,
              histogram(user_agent) as user_agent_pv,
              avg(request_time) as avg_latency,
              max(request_time) as max_latency
  • Bandingkan jumlah tampilan halaman (PV) hari ini dengan PV kemarin​ (Debug).

    * |
    select
      diff [1] as today,
      round((diff [3] -1.0) * 100, 2) as growth
    FROM
      (
        SELECT
          compare(pv, 86400) as diff
        FROM
          (
            SELECT
              COUNT(1) as pv
            FROM
              log
          )
      )
  • Hitung perubahan jumlah tampilan halaman (PV) dari hari ke hari.

    * |
    select
      t,
      diff [1] as today,
      diff [2] as yestoday,
      diff [3] as percentage
    from(
        select
          t,
          compare(pv, 86400) as diff
        from
          (
            select
              count(1) as pv,
              date_format(from_unixtime(__time__), '%H:%i') as t
            from
              log
            group by
              t
            limit
              10000
          )
        group by
          t
        order by
          t
        limit
          10000
      )

Atur alert

Konfigurasikan alert untuk lonjakan latensi, error server, dan anomali traffic. Untuk prosedur lengkapnya, lihat Atur alert.

  • Error alert

    Pantau tanggapan 500 (server error). Kueri berikut menghitung jumlah error (c) per satuan waktu. Atur kondisi pemicu alert menjadi c > 0.

    status:500 | select count(1) as c
    Catatan

    Untuk layanan dengan traffic tinggi di mana error 500 sesekali diharapkan, atur Notification Trigger Threshold menjadi 2. Ini akan memicu alert hanya ketika kondisi terpenuhi dalam dua pemeriksaan berturut-turut.

    Pada dialog pembuatan alert, atur Alert Name menjadi Error Alert. Untuk Add to Dashboard, pilih Create dan tentukan nama dasbor sebagai Nginx. Atur Chart Name menjadi Error Alert, Query Interval menjadi 1 Day (On the Hour), dan Check Frequency menjadi Fixed Interval selama 15 Minutes. Terakhir, atur Notification Interval menjadi 5 Minutes.

  • Performance alert

    Buat alert latensi. Kueri berikut menghitung latensi rata-rata semua permintaan Post ke titik akhir /adduser. Atur kondisi pemicu menjadi l > 300000 untuk memberi alert ketika latensi rata-rata melebihi 300 ms.

    Method:Post and URL:"/adduser" | select avg(request_time) as l

    Alert berbasis rata-rata dapat menyembunyikan permintaan individual dengan latensi tinggi. Gunakan persentil (seperti P99) sebagai kondisi pemicu. Kueri berikut menghitung latensi persentil ke-99.

    Method:Post and URL:"/adduser" | select approx_percentile(request_time, 0.99) as p99

    Untuk pemantauan, hitung latensi rata-rata, P50, dan P99 per menit dalam jendela satu hari (1.440 menit).

    * | select avg(request_time) as l, approx_percentile(request_time, 0.5) as p50, approx_percentile(request_time, 0.99) as p99, date_trunc('minute', time) as t group by t order by t desc limit 1440

    Latency distribution chart

  • Alert lonjakan atau penurunan traffic

    Penurunan atau lonjakan traffic yang tiba-tiba biasanya tidak normal. Deteksi anomali dengan membandingkan traffic saat ini terhadap salah satu garis dasar berikut:

    • Jendela waktu sebelumnya.

    • Jendela waktu yang sama pada hari sebelumnya.

    • Jendela waktu yang sama pada minggu sebelumnya.

    Contoh berikut menggunakan metode pertama untuk menghitung laju perubahan dalam rentang kueri 5 menit.

    1. Tentukan jendela perhitungan.

      Tentukan jendela 1 menit untuk menghitung traffic per menit.

      * | select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15

      Hasilnya berisi dua kolom: window_time dan inflow. Kolom inflow menunjukkan nilai traffic untuk setiap jendela 1 menit.

    2. Hitung selisih dalam jendela.

      • Hitung rasio nilai maksimum atau minimum terhadap nilai rata-rata. Contoh ini menggunakan rasio maksimum (max_ratio).

        Dalam contoh ini, max_ratio adalah 1,02. Atur kondisi alert menjadi max_ratio > 1,5 (laju perubahan melebihi 50%) untuk memicu alert.

         * | select max(inflow)/avg(inflow) as max_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15) 
      • Hitung laju perubahan untuk nilai terbaru guna memeriksa apakah traffic berfluktuasi atau telah kembali normal.

        Gunakan fungsi max_by untuk mendapatkan traffic maksimum dalam jendela. Nilai latest_ratio sebesar 0,97 berarti traffic terbaru adalah 97% dari rata-rata.

         * | select max_by(inflow, window_time)/1.0/avg(inflow) as latest_ratio from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15) 
        Catatan

        Hasil fungsi max_by bertipe string dan harus dikonversi ke tipe numerik. Jika ingin menghitung laju perubahan relatif, Anda dapat menggunakan (1.0-max_by(inflow, window_time)/1.0/avg(inflow)) as latest_ratio.

      • Hitung volatilitas, yaitu perubahan antara nilai jendela saat ini dan jendela sebelumnya.

        Gunakan fungsi jendela lag untuk menghitung selisih antara traffic saat ini inflow dan periode sebelumnya inflow "lag(inflow, 1, inflow)over() ", dibagi dengan inflow saat ini. Penurunan signifikan (misalnya pada pukul 11:39) menunjukkan laju perubahan melebihi 40%.

        Catatan

        Gunakan fungsi abs untuk menghitung laju perubahan absolut.

         * | select (inflow- lag(inflow, 1, inflow)over() )*1.0/inflow as diff, from_unixtime(window_time) from (select sum(inflow)/(max(__time__)-min(__time__)) as inflow , __time__-__time__%60  as window_time from log group by window_time order by window_time limit 15) 

        Window difference calculation