Есть система сбора логов, в которую отдаются логи Nginx в виде JSON.
В log_format используется
"upstream_status":$upstream_status
Всё хорошо когда в переменной действительно что-то есть(то есть запрос проходил через upstream).
Но когда переменная пустая (то есть запрос отработал без участия upstream) то JSON ломается и вообще всё становится плохо (мне нужно поле в виде числа, поэтому передавать в кавычках не подходит)
Чтобы это решить я склоняюсь использовать два разных шаблона log_format: with_upstream и without_upstream.
Соответственно в шаблоне without_upstream переменных upstream_* вообще не будет, поэтому JSON ломаться не будет и всё станет хорошо.
Для случаев с участием upstream конфиг получается вида:
access_log access.log with_upstream if=$upstream_status
Но как определить что запрос не проходил через upstream?
access_log access.log without_upstream if=???
Попробовал
map $upstream_status $need_log {
"~^$" 1;
}
Но не взлетело. Посоветуйте же ваши советы