Undefined переменная при логировании

Максим maxout.mail на gmail.com
Пн Ноя 9 10:38:36 UTC 2015


Есть вот такой вот набор (в реальности всё разумеется сложнее, но свелось к
этому компактному конфигу):

error_log  /bla/error.log warn;

http {
    uninitialized_variable_warn on;
    log_format  combinedvhost  '$host_short $remote_addr - $remote_user
[$time_local] '
                          '"$request" $status $body_bytes_sent '
                          '"$http_referer" "$http_user_agent"';

    access_log /bla/access_log combinedvhost;

    server {
        set $host_short "MYSTRING";

        listen       blah:80;
        server_name  all;

        .....
    }

Всё логируется замечательно, но иногда приходит некий (некорректный,
видимо) запрос, и с переменной $host_short творится странное:

в error_log:
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

в access_log:
 109.196.xxx.xx - - [09/Nov/2015:13:16:45 +0300] "-" 400 0 "-" "-"

Как видно из первого лога, мы попали в правильный блок server{}
Но как видно из обоих логов, в нём не обработалась директива set.

Видимо, в nginx есть какая-то оптимизация внутри для некорректного запроса,
и исполнение инструкций внутри server{} отбрасывается. Прав ли я в этом?
А самое главное, как решить проблему порчи логов? set на уровне http
очевидно невозможен.

Будет ли полноценным решением воспользоваться функционалом из nginx 1.7.0
по условному логгированию?
как-то так, чтоли: access_log /path/to/access.log combined_vhost
if=($status != 400);

Или это тоже не будет работать?

Можно ли как-то решить вопрос, не обновляясь до 1.7.0?
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20151109/6a3a852f/attachment.html>


Подробная информация о списке рассылки nginx-ru