Вопрос или проблема
Файл Apache default.conf определяет формат журнала доступа следующим образом
LogFormat "%v\t%p\t%h\t%{Company}C\t%t\t%T\t%X\t%>s\t%O\t%r\t%{Referer}i\t%{User-Agent}i\t%{.EevaAuth}C" eevalog
CustomLog ${APACHE_LOG_DIR}/access.log eevalog
В файлах конфигурации apache и .htaccess нет других директив CustomLog.
Файл access.log содержит в основном корректные строки журнала, такие как
example.com 443 1.2.3.4 19 [29/Jan/2025:00:00:05 +0200] 0 + 200 1601597 GET /
Некоторые строки в файле access.log находятся в другом формате:
34.83.132.105 - - [29/Jan/2025:04:59:23 +0200] "GET / HTTP/1.1" 200 414 "-" "Mozilla/5.0 (Windows NT 10.0; Win64;.."
Похоже, что если в запросе нет имени хоста, apache использует формат журнала по умолчанию.
Определение формата журнала находится в файле /etc/apache2/conf-enabled/default.conf на верхнем уровне, вне любого VirtualHost или других элементов. Оно должно использоваться для всех записей журнала, но, похоже, что формат журнала по умолчанию все еще используется.
Как заставить все строки в файле журнала соответствовать формату, определенному корневой директивой CustomLog:
CustomLog ${APACHE_LOG_DIR}/access.log eevalog
файл apache error.log содержит
[Thu Jan 30 00:00:05.801571 2025] [mpm_prefork:notice] [pid 1596306:tid 1596306] AH00163: Apache/2.4.62 (Debian) OpenSSL/3.0.15 сконфигурирован -- возобновление нормальной работы
[Thu Jan 30 00:00:05.801630 2025] [core:notice] [pid 1596306:tid 1596306] AH00094: Командная строка: '/usr/sbin/apache2'
Файл /etc/apache2/apache2.conf не модифицирован. Он не содержит директивы CustomLog, только LogFormat:
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Используется Debian 12
Ответ или решение
Настройка и управление Apache для обеспечения использования заданного формата для всех записей логов может быть вызовом, особенно когда разные записи логов появляются с использованием различных форматов. В данном случае, проблема заключается в том, что при отсутствии имени хоста в запросе, Apache прибегает к использованию логов по умолчанию. Рассмотрим пошагово, как можно настроить Apache для использования пользовательского формата логов для всех записей.
Теория
Apache HTTP Server предоставляет возможность детализированной настройки, в том числе возможности определения формата записей логов. Каждый формат определяется директивой LogFormat
, а затем применяется к файлу логов через директиву CustomLog
. Однако поведение логирования может быть сложным из-за множества возможных мест конфигурации, таких как файлы конфигураций основного сервера, сайтов и виртуальных хостов, а также .htaccess
файлов.
Ваш случай предполагает, что конфигурация LogFormat
и CustomLog
настроена в верхнем уровне файла /etc/apache2/conf-enabled/default.conf
. Это должно гарантировать, что все запросы записываются в заданном вами формате. Однако неверные записи в логе указывают на то, что по умолчанию используется другой формат логов, подтверждая потенциальные конфликты конфигурации.
Примеры
В вашем случае основной конфигурационный файл /etc/apache2/apache2.conf
содержит несколько определений LogFormat
, которые могут быть унаследованы, как только Apache не найдет специфический формат для запроса на текущем уровне конфигурации. Это ведет к использованию стандартных форматов, таких как combined
или common
.
Пример заданного вами формата:
LogFormat "%v\t%p\t%h\t%{Company}C\t%t\t%T\t%X\t%>s\t%O\t%r\t%{Referer}i\t%{User-Agent}i\t%{.EevaAuth}C" eevalog
CustomLog ${APACHE_LOG_DIR}/access.log eevalog
Пример записи, содержащей ошибочный формат:
34.83.132.105 - - [29/Jan/2025:04:59:23 +0200] "GET / HTTP/1.1" 200 414 "-" "Mozilla/5.0 (Windows NT 10.0; Win64;.."
Применение
Чтобы обеспечить, что все записи будут формироваться в нужном формате, выполните следующие шаги:
-
Проверка других конфигурационных файлов:
Убедитесь, что никакие другие конфигурационные файлы в/etc/apache2/sites-enabled/
или/etc/apache2/conf-enabled/
не содержат директивCustomLog
, которые могут переопределять вашу глобальную настройку. Проверьте также наличие таких директив в файлах.htaccess
, если это применимо. -
Обновление глобальной конфигурации:
Если другие конфигурации содержатLogFormat
иCustomLog
, они должны быть либо удалены, либо изменены так, чтобы ссылаться на ваш пользовательский форматeevalog
. -
Редактирование дефолтной конфигурации виртуального хоста:
Поскольку проблема возникает при отсутствии имени хоста, убедитесь, что дефолтные виртуальные хосты (000-default.conf
и его аналоги) используют вашу конфигурациюCustomLog
. В случае Debian, файл конфигурации может находиться в/etc/apache2/sites-available/
. -
Дополнительная конфигурация:
Добавьте или измените глобальную директиву в/etc/apache2/apache2.conf
таким образом, чтобы принудительно использовать ваш формат как стандартный, либо добавьте точку монтирования виртуальных хостов к этой конфигурации. -
Перезагрузка Apache:
После всех изменений перезапустите Apache, чтобы применить новые настройки:sudo systemctl restart apache2
Эти шаги должны помочь вам привести все записи логов к единому пользовательскому формату. Важно понимать, что правильное логирование позволяет не только следить за обращениями пользователей, но и предоставляет ценные данные для аналитики и оптимизации производительности. Следуя указанным выше шагам, вы сможете более точно контролировать это поведение Apache и обеспечивать целостность используемых форматов логов.