#Симптом и границы применимости
После обновления Apache журнал error.log или access.log перестаёт появляться на прежнем месте. Возможные причины: выбран другой VirtualHost, настройки ErrorLog/CustomLog изменены, Apache запущен в контейнере, а запись перенаправлена в systemd journal или в отдельный файл. Не создавайте пустой журнал до выяснения источника.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Изменён путь в VirtualHostКаждый VirtualHost может использовать собственные журналы. | В active-конфиге другой ErrorLog/CustomLog | Найти фактическую директиву и путь |
| Журнал попадает в контейнер или syslogУправляющая система может перенаправлять стандартные потоки. | Файл не растёт, но записи видны в journalctl/docker logs | Проверить способ запуска и сбор логов |
| Нет разрешения на запись или место кончилосьСлужбе может быть запрещено открывать новый файл. | Ошибки открытия файла или No space left on device | Проверить владельца каталога, диск и logrotate |
#Пошаговая диагностика и исправление
- Определите конкретный экземпляр ApacheПодключитесь к SSH нужного сервера; выясните, работает ли Apache как apache2/httpd, внутри контейнера или за панелью. Путь /var/log/apache2 подходит не каждой системе. Сначала воспроизведите один безопасный HTTP-запрос и запишите время для поиска.
- Только чтение; имя apache2ctl замените для своей сборкиLinux · Терминал (Bash)КомандаНужен sudoТолько чтение; имя apache2ctl замените для своей сборки.
sudo apache2ctl -S; ps -eo pid,comm,args | grep -E "apache2|httpd" | head
- Найдите активные директивы логированияОткройте VirtualHost, который обрабатывает домен, и найдите ErrorLog, CustomLog, GlobalLog, TransferLog. Относительный путь интерпретируется относительно ServerRoot. Если директивы указывают на piped logger, файл на диске может не создаваться напрямую.
- В Debian; в RHEL чаще /etc/httpdLinux · Терминал (Bash)КомандаНужен sudoВ Debian; в RHEL чаще /etc/httpd. Вывод может содержать приватные пути.
sudo grep -R -nE "^[[:space:]]*(ErrorLog|CustomLog|GlobalLog|TransferLog)" /etc/apache2
- Проверьте журналы службы и открытые файлыВ systemd посмотрите последние строки journalctl -u apache2, а затем при наличии lsof используйте его только для определённого процесса Apache. Если Apache в контейнере, смотрите журнал контейнера через его платформу; не предполагайте наличие доступа с хоста к внутренним каталогам.Linux · Терминал (Bash)КомандаНужен sudoДля Debian с systemd; ошибки HTTP-запросов могут храниться в отдельном файле.
sudo journalctl -u apache2 -n 90 --no-pager
- Проверьте вращение и местоКоманда df показывает свободное место; ls -ld — разрешения каталога логов. Посмотрите настройки logrotate и убедитесь, что файлы не переименовываются при ротации. Не удаляйте старые журналы без срока хранения и согласования с администратором.
- Путь условный; если отсутствует, смотрите фактический ErrorLogLinux · Терминал (Bash)КомандаНужен sudoПуть условный; если отсутствует, смотрите фактический ErrorLog.
df -h; sudo ls -ld /var/log/apache2; sudo ls -l /var/log/apache2 | tail
- Восстановите правильное направление журналовЕсли конфигурация содержит неверный путь, сохраните файл перед правкой и укажите существующий каталог, доступный службе. Если дело в ротации, исправьте процедуру открытия файла согласно установке. После configtest и reload сделайте один тестовый запрос; не давайте журналам права записи всем пользователям.
- Использовать после корректировки и резервной копии; Debian/UbuntuLinux · Терминал (Bash)С осторожностьюНужен sudoИспользовать после корректировки и резервной копии; Debian/Ubuntu.
sudo apache2ctl configtest && sudo systemctl reload apache2Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Новое обращение к выбранному сайту появляется в соответствующем журнале; сообщения об ошибках видны по нужному пути; логирование других VirtualHost не нарушено.
#Если проблема не устранена
Если запросов нет в файле, проверьте, не формирует ли ответ CDN/Nginx до Apache; для контейнера смотрите его штатные потоки stdout/stderr.