Todos os produtos
Search
Central de documentação

Simple Log Service:Analisar logs de acesso do Nginx

Última atualização: Jul 03, 2026

O Simple Log Service oferece suporte à análise multidimensional de logs de acesso do Nginx. Este tópico aborda a análise de tráfego do site, o diagnóstico de latência e a configuração de alertas com consultas de exemplo.

Pré-requisitos

Os logs de acesso do Nginx foram coletados. Coletar logs de texto usando o modo de configuração do Nginx.

O assistente de importação de dados gera automaticamente um índice com base nos campos de log. Se necessário, modifique o índice seguindo as instruções em Criar um índice.

Visão geral

Os logs do Nginx são essenciais para a operação de sites. Abordagens tradicionais, como o CNZZ, exigem a injeção de JavaScript no frontend, enquanto a computação em stream ou offline requer uma infraestrutura complexa e sacrifica o desempenho em tempo real ou a flexibilidade analítica.

O Simple Log Service coleta logs do Nginx por meio do assistente de importação de dados e cria automaticamente um índice e um painel. O painel nginx_Nginx access log exibe a distribuição de IPs de origem, status das requisições, user agents, tendências de PV/UV, estatísticas de tráfego, principais referrers e URLs mais acessadas. Com consultas personalizadas, visualize a latência e configure alertas contra erros ou anomalias de tráfego.

Analisar o tráfego do site

  1. Faça login no console do Simple Log Service.

  2. Na seção Projects, clique em um projeto desejado.

    image

  3. No painel de navegação à esquerda, escolha Log Storage > Logstores. clique em > à esquerda do Logstore desejado.

  4. Em Dashboard, clique em nginx_Nginx access log.

    O painel nginx_Nginx access log inclui os seguintes gráficos:

    • O gráfico Distribution of source IP addresses apresenta a distribuição geográfica dos IPs de requisição no último dia. Consulta:

      * | select count(1) as c, ip_to_province(remote_addr) as address group by address limit 100
    • Já o gráfico Distribution of request statuses exibe a porcentagem de cada código de status HTTP no último dia. Consulta:

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

      Nginx access logs - request status distribution

    • Para métodos de requisição, o gráfico Distribution of request methods indica a porcentagem de cada método no último dia. Consulta:

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

      Nginx access logs - request method distribution

    • O gráfico Distribution of user agents detalha a porcentagem de diferentes navegadores no último dia. Consulta:

      * | 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

    • As 10 principais páginas de referência por PV no último dia são destacadas no gráfico Top 10 referrers. Consulta:

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

      Nginx access logs - top 10 referrers

    • O tráfego de entrada e saída no último dia é apresentado no gráfico Inbound and outbound traffic statistics. Consulta:

      * | 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

    • O gráfico PV/UV statistics exibe as contagens de PV e UV no último dia. Consulta:

      *| 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

    • Para previsões, o gráfico PV forecast estima o PV para as próximas 4 horas. Consulta:

      * | 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

    • Por fim, o gráfico Top 10 accessed URLs lista as 10 URLs mais requisitadas por PV no último dia. Consulta:

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

Diagnosticar e otimizar o desempenho do site

Monitore a latência das requisições para identificar páginas lentas. Use consultas personalizadas para analisar padrões de latência. Para saber mais sobre a sintaxe de consulta, consulte Guia de início rápido para pesquisa e análise.

  • Calcule a latência média e máxima das requisições a cada 5 minutos para compreender as tendências gerais de latência.

      * | 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
  • Identifique as páginas com maior latência para priorizar a otimização.

      * | select from_unixtime(__time__ - __time__% 60) , 
              max_by(request_uri,request_time)  
              group by __time__ - __time__%60
  • Agrupe os valores de latência em 10 intervalos para analisar a distribuição.

    * |select numeric_histogram(10,request_time)
  • Obtenha os 10 maiores valores de latência e suas respectivas requisições.

    * | select max(request_time,10)
  • Otimize a página com maior latência.

    Por exemplo, se /url2 tiver a maior latência, otimize a página /url2 calculando seu PV, UV, métodos de requisição, códigos de status, navegadores, latência média e latência máxima para /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
  • Compare as visualizações de página (PV) de hoje com o PV de ontem (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
          )
      )
  • Calcule a variação diária nas visualizações de página (PVs).

    * |
    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
      )

Configurar alertas

Configure alertas para picos de latência, erros de servidor e anomalias de tráfego. Para o procedimento completo, consulte Configurar um alerta.

  • Alerta de erro

    Monitore as respostas 500 (erro de servidor). A consulta a seguir conta os erros (c) por unidade de tempo. Defina a condição de acionamento do alerta como c > 0.

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

    Para serviços de alto tráfego em que erros 500 ocasionais são esperados, defina o Notification Trigger Threshold como 2. Isso aciona um alerta apenas quando a condição é atendida em duas verificações consecutivas.

    Na caixa de diálogo de criação de alerta, defina Alert Name como Error Alert. Para Add to Dashboard, selecione crie e especifique o nome do painel como Nginx. Defina Chart Name como Error Alert, Query Interval como 1 Day (On the Hour) e Check Frequency como um Fixed Interval de 15 Minutes. Por fim, defina Notification Interval como 5 Minutes.

  • Alerta de desempenho

    Crie um alerta de latência. A consulta a seguir calcula a latência média de todas as requisições Post para o endpoint /adduser. Defina a condição de acionamento como l > 300000 para alertar quando a latência média exceder 300 ms.

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

    Alertas baseados em média podem mascarar requisições individuais com alta latência. Em vez disso, use um percentil (como P99) como condição de acionamento. A consulta a seguir calcula a latência do 99º percentil.

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

    Para monitoramento, calcule a latência média, P50 e P99 por minuto em uma janela de um dia (1.440 minutos).

    * | 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

  • Alerta de pico ou queda de tráfego

    Quedas ou picos repentinos de tráfego geralmente são anormais. Detecte anomalias comparando o tráfego atual com uma das seguintes linhas de base:

    • A janela de tempo anterior.

    • A mesma janela de tempo no dia anterior.

    • A mesma janela de tempo na semana anterior.

    O exemplo a seguir usa o primeiro método para calcular a taxa de variação em um intervalo de consulta de 5 minutos.

    1. Defina uma janela de cálculo.

      Defina uma janela de 1 minuto para calcular o tráfego por minuto.

      * | 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

      O resultado contém duas colunas: window_time e inflow. A coluna inflow mostra o valor de tráfego para cada janela de 1 minuto.

    2. Calcule a diferença dentro da janela.

      • Calcule a proporção do valor máximo ou mínimo em relação ao valor médio. Este exemplo usa a proporção máxima (max_ratio).

        Neste exemplo, max_ratio é 1,02. Defina a condição de alerta como max_ratio > 1.5 (taxa de variação superior a 50%) para acionar um alerta.

         * | 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) 
      • Calcule a taxa de variação do valor mais recente para verificar se o tráfego está flutuando ou se voltou ao normal.

        Use a função max_by para obter o tráfego máximo na janela. Um latest_ratio de 0,97 significa que o tráfego mais recente é 97% da média.

         * | 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) 
        Nota

        O resultado da função max_by é do tipo string e você deve convertê-lo para um tipo numérico. Se quiser calcular a taxa de variação relativa, use (1,0-max_by(inflow, window_time)/1,0/avg(inflow)) as latest_ratio.

      • Calcule a volatilidade, que é a variação entre o valor da janela atual e o da janela anterior.

        Use a função de janela lag para calcular a diferença entre o tráfego atual inflow e o inflow "lag(inflow, 1, inflow)over() " do período anterior, dividida pelo inflow atual. Uma queda significativa (como às 11:39) mostra uma taxa de variação superior a 40%.

        Nota

        Use a função abs para calcular uma taxa de variação absoluta.

         * | 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