ДК: логи nginx в json формате
Бортовой дневник. Запись №3122
Если вам в вашем морском путешествии по пучинам безнадежности понадобится логировать nginx в json формате, то сейчас это ещё проще сделать:
- Делаем псевдо-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;
_Всегда ваш, Капитан Очеви Дность.