logging

logging

  • Convertendo os logs do servidor web pra json

    Confesso que pra escrever o script pra lers os logs do servidor web, aquele que mostrei em acessos de robôs nos logs web, foi algo próximo do vudu. Tudo porque o formato gerado não é lá muito amigável.

    Idem pras máquinas do trabalho. Então hoje eu resolvi dar uma olhada se tinha como escrever esses mesmos logs em json.

    E tem.

    nginx

    O primeiro que olhei foi no nginx. E é bem fácil de fazer.

      
    log_format logger-json escape=json '{"source": "nginx", "time": "$time_iso8601", "resp_body_size": $body_bytes_sent, "host": "$http_host", "address": "$remote_addr", "request_length": $request_length, "method": "$request_method", "uri": "$request_uri", "status": $status,  "user_agent": "$http_user_agent", "resp_time": $request_time, "upstream_addr": "$upstream_addr"}';  
    [...]
    server {
        listen 443 ssl;
        server_name api.company.com;
       ...
    
        access_log /var/log/nginx/access.log logger-json;
       ...
    }
     
    

    Eu segui a receita desses dois links aqui:

    Apache

    Pro Apache não tem um módulo que já gera tudo meio mastigado como no nginx. Mas você pode criar o formato do log como quiser.

      
    LogFormat "{ \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"process\":\"%D\", \"filename\":\"%f\", \"remoteIP\":\"%a\", \"host\":\"%V\", \"request\":\"%U\", \"query\":\"%q\", \"method\":\"%m\", \"status\":\"%>s\", \"userAgent\":\"%{User-agent}i\", \"referer\":\"%{Referer}i\" }" combined
    ErrorLogFormat "{ \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \"[pid %P:tid %T]\" , \"message\" : \"%M\" ,\ \"referer\"\ : \"%{Referer}i\" }"    
     
    

    E esse veio de dica do stack-overflow:

    Eu não segui os mesmos parâmetros entre apache e nginx. Por enquanto estou só testando e estar com os campos bem definidos já é o suficiente pra mim.

    Resultado

      
    > tail -1 /var/log/apache2/linux-br-access.log | jq .
    {
      "time": "2025-08-20T09:38:59.369Z",
      "process": "241797",
      "filename": "/var/www/linux-br.org/index.php",
      "remoteIP": "54.36.149.72",
      "host": "linux-br.org",
      "request": "/date/2024/03/page/3/",
      "query": "",
      "method": "GET",
      "status": "200",
      "userAgent": "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)",
      "referer": "-"
    }
     
    

    Agora ficou fácil de filtrar e pegar só os campos que interessam. E usando "jq".

      
    > tail -1 /var/log/apache2/linux-br-access.log | jq ".userAgent"
    "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"
    > tail -3 /var/log/apache2/linux-br-access.log | jq ".userAgent"
    "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"
    "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)"
    "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)"
     
    
We use cookies

We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience (tracking cookies). You can decide for yourself whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.