ДК: логи nginx в json формате

Бортовой дневник. Запись №3122

Если вам в вашем морском путешествии по пучинам безнадежности понадобится логировать nginx в json формате, то сейчас это ещё проще сделать:

  1. Делаем псевдо-json так же, как делали наши деды:
    log_format json '{ "@timestamp": "$time_iso8601", '
                   '"remote_addr": "$remote_addr", '
                   '"body_bytes_sent": "$body_bytes_sent", '
                   '"status": $status, '
                   '"request": "$request", '
                   '"url": "$uri", '
                   '"request_method": "$request_method", '
                   '"response_time": $upstream_response_time, '
                   '"http_referrer": "$http_referer", '
                   '"http_user_agent": "$http_user_agent" }';

2. Начиная с версии 1.11.8 можно задать экранирование символов

escape=json

3. Опытные путешественники знают, что если переменная не выставлена, то в логах nginx появится похабнейший прочерк, который сломает парсер (ведь доверчивые парсеры ждут не строку, а число). Поэтому мы на числовые поля добавляем map

    map $upstream_response_time $temprt {
      default $upstream_response_time;
      ""      0;
    }

И в самом логформате вместо переменной upstream_response_time уже используем переменную temprt, которая всегда будет числовой.
Такие мапы надо повторить для каждой переменной с числовым значением.

4. Набейте лог переменными по вкусу. Сами переменные можно посмотреть тут

Результат

    map $upstream_response_time $temprt {
      default $upstream_response_time;
      ""      0;
    }
    
    log_format json escape=json '{ "@timestamp": "$time_iso8601", '
                   '"remote_addr": "$remote_addr", '
                   '"body_bytes_sent": "$body_bytes_sent", '
                   '"status": $status, '
                   '"request": "$request", '
                   '"url": "$uri", '
                   '"request_method": "$request_method", '
                   '"response_time": $temprt, '
                   '"http_referrer": "$http_referer", '
                   '"http_user_agent": "$http_user_agent" }';

    access_log  /log/access.log  json;

_Всегда ваш, Капитан Очеви Дность.