Как создать журнал JSON из nginx?
Я пытаюсь создать журнал JSON из nginx.
Я знаю такие решения, как этот, но некоторые из полей, которые я хочу записать, включают введенные пользователем ввод (например, HTTP-заголовки), которые должны быть экранированы должным образом.
Я знаю записи изменений в nginx с октября 2011 года по май 2008 года, которые говорят:
*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
access_log.
*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
in an access_log.
но это все равно не помогает, поскольку \xXX
недействителен в строке JSON.
Я также рассмотрел модуль HttpSetMiscModule, который имеет директиву set_quote_json_str
, но это просто добавляет \x22
вокруг строки, которые не помогают.
Любая идея для других решений для входа в формат JSON из nginx?
Ответы
Ответ 1
Наконец, похоже, что у нас есть хороший способ сделать это с помощью ванильного nginx без каких-либо модулей. Просто определите:
log_format json_combined escape=json '{ "time_local": "$time_local", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request": "$request", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
Обратите внимание, что escape = json был добавлен в nginx 1.11.8.
http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
Ответ 2
Вы можете попробовать использовать этот https://github.com/jiaz/nginx-http-json-log - модуль добавления для Nginx.
Ответ 3
Вы можете попробовать:
PS:
Параметр if (1.7.0) позволяет условное ведение журнала. Запрос не будет регистрироваться, если условие оценивается как "0" или пустая строка:
map $status $http_referer{
~\xXX 0;
default 1;
}
access_log /path/to/access.log combined if=$http_referer;
Хорошая идея использовать такой инструмент, как https://github.com/zaach/jsonlint, чтобы проверить данные JSON. Вы можете протестировать вывод своего нового формата ведения журнала и убедиться, что его реальный и правильный JSON.