Странное поведение Apache CustomLog

Я добавляю функцию проверки работоспособности Docker, которую я успешно выполнил в одном контейнере, но добавление того же кода в другой контейнер ведет себя странно.

По сути, я просто пытаюсь не регистрировать определенные запросы, используя env var.

В dockerfile:

HEALTHCHECK CMD curl -ILfSs http://localhost:80 -A "HealthCheck" || exit 1

RUN ln -sf /dev/stdout /var/www/logs/access.log \
    && ln -sf /dev/stdout /var/www/logs/transfer.log \
    && ln -sf /dev/stdout /var/www/logs/ssl-transfer.log \
    && ln -sf /dev/stderr /var/www/logs/error.log \
    && ln -sf /dev/stderr /var/www/logs/ssl-error.log

В httpd.conf:

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    <IfModule setenvif_module>
       BrowserMatchNoCase ^healthcheck nolog
    </IfModule>

    CustomLog "logs/access.log" combinedio env=!nolog

</IfModule>

Итак, теперь, когда проверка работоспособности тикает, журнал, который обычно показывает это:

127.0.0.1 - - [05/Oct/2022:03:22:13 +0000] "HEAD / HTTP/1.1" 200 - "-" "HealthCheck" 74 1095

показывает это (он вообще ничего не должен показывать, поскольку env var устанавливается, когда UserAgent соответствует «healthcheck»):

127.0.0.1 - - [05/Oct/2022:05:17:46 +0000] "HEAD / HTTP/1.1" 200 -

Он действует почти так, как если бы он заменял все, что соответствует «healthcheck», и после этого вообще ничего (пустая строка), на что я не думаю, что он даже должен быть способен (?).

Я проверил, чтобы убедиться, что единственная проверка работоспособности вызывается в httpd.conf, закомментировав строку BrowserMatchNoCase ^healthcheck nolog, и она действительно просто показывает обычную, ожидаемую строку, содержащую пользовательский агент «HealthCheck».


58
2

Ответы:

Если ожидаемое условие не соответствует И формат неверен, самое простое объяснение состоит в том, что в вашей конфигурации есть вторая директива CustomLog.

Кроме того, я бы удалил все ifmodules. Вы не хотите, чтобы этот материал был пропущен, если модули не загружены, вы хотите, чтобы он не работал.


Решено

Тайна раскрыта; в конфигах был "скрытый" TransferLog, который совпадал с моим CustomLog, поэтому мои вещи действительно работали, как задумано, но TransferLog также вызывался, поэтому они оба выводились в журнал одновременно для каждого HealthCheck вызова .

Я говорю «скрытый», потому что, хотя он был на виду, я впервые лично столкнулся с директивой TransferLog; Я всегда просто использовал CustomLog и не знал, как TransferLog работает в сочетании с CustomLog, когда они оба присутствуют.

Удаление TransferLog полностью и только с помощью CustomLog (поскольку оно позволяет форматировать журнал, а TransferLog нет) помогло.