Я добавляю функцию проверки работоспособности 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».
Если ожидаемое условие не соответствует И формат неверен, самое простое объяснение состоит в том, что в вашей конфигурации есть вторая директива CustomLog
.
Кроме того, я бы удалил все ifmodules. Вы не хотите, чтобы этот материал был пропущен, если модули не загружены, вы хотите, чтобы он не работал.
Тайна раскрыта; в конфигах был "скрытый" TransferLog
, который совпадал с моим CustomLog
, поэтому мои вещи действительно работали, как задумано, но TransferLog
также вызывался, поэтому они оба выводились в журнал одновременно для каждого HealthCheck
вызова .
Я говорю «скрытый», потому что, хотя он был на виду, я впервые лично столкнулся с директивой TransferLog
; Я всегда просто использовал CustomLog
и не знал, как TransferLog
работает в сочетании с CustomLog
, когда они оба присутствуют.
Удаление TransferLog
полностью и только с помощью CustomLog
(поскольку оно позволяет форматировать журнал, а TransferLog нет) помогло.