<div dir="ltr"><div><div>Есть вот такой вот набор (в реальности всё разумеется сложнее, но свелось к этому компактному конфигу):<br><br>error_log  /bla/error.log warn;<br><br>http {<br>    uninitialized_variable_warn on;<br>    log_format  combinedvhost  '$host_short $remote_addr - $remote_user [$time_local] '<br>                          '"$request" $status $body_bytes_sent '<br>                          '"$http_referer" "$http_user_agent"';<br><br>    access_log /bla/access_log combinedvhost;<br><br>    server {<br>        set $host_short "MYSTRING";<br><br>        listen       blah:80;<br>        server_name  all;<br><br>        .....<br>    }<br><br></div>Всё логируется замечательно, но иногда приходит некий (некорректный, видимо) запрос, и с переменной $host_short творится странное:<br><br>в error_log:<br>2015/11/09 13:16:45 [warn] 58369#0: *41 using uninitialized "host_short" variable while logging request, client: 109.196.xxx.xx, server: all<br><br></div>в access_log:<br> 109.196.xxx.xx - - [09/Nov/2015:13:16:45 +0300] "-" 400 0 "-" "-"<br><br><div>Как видно из первого лога, мы попали в правильный блок server{}<br></div><div>Но как видно из обоих логов, в нём не обработалась директива set.<br></div><div><br></div><div>Видимо, в nginx есть какая-то оптимизация внутри для некорректного запроса, и исполнение инструкций внутри server{} отбрасывается. Прав ли я в этом?<br>А самое главное, как решить проблему порчи логов? set на уровне http очевидно невозможен.<br><br></div><div>Будет ли полноценным решением воспользоваться функционалом из nginx 1.7.0 по условному логгированию?<br>как-то так, чтоли: access_log /path/to/access.log combined_vhost if=($status != 400);<br><br></div><div>Или это тоже не будет работать?<br><br></div><div>Можно ли как-то решить вопрос, не обновляясь до 1.7.0?<br><br></div></div>