Подтвердить что ты не робот

Как создать журнал 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?

4b9b3361

Ответ 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

Ответ 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.