Назад | Перейти на главную страницу

Единичный ErrorLog Apache, много VirtualHosts

У меня есть веб-сервер с множеством (тысячами) VirtualHosts. В текущей конфигурации Apache заполняет 2 файла для каждого VirtualHost: error.log + access.log. Apache работает в режиме prefork, и чтобы избежать одновременного открытия множества файловых дескрипторов, я хотел бы иметь единый access.log и error.log для всех VirtualHosts.

Задача CRON будет разделять файлы для каждого VirtualHost один раз в день, поэтому мне нужно имя VirtualHost в каждой строке файлов * .log. Для access.log это довольно просто:

LogFormat "%V:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
CustomLog /var/log/apache2/vhosts_access.log vhost_combined

% V дает мне имя VirtualHost, и этого достаточно для разделения файлов.

Но я просто не могу найти эквивалентную настройку для ErrorLog.

Вопросы:

  1. на ваш взгляд, уместно ли пытаться определить каждое происхождение каждой строки error.log
  2. ты знаешь решение?

ErrorLog директива в Apache не может быть изменен.

Если вы намерены сократить количество FD, с помощью единого журнала доступа, тысяч виртуальных хостов, вы уменьшите их (FD) как минимум на n * виртуальных хостов.

Я предлагаю вести журнал ошибок для каждого VH и, как вы говорите, разделить журнал доступа, поскольку вы уже это делаете.

Если так же НЕОБХОДИМО настроить единый журнал ошибок, каждая запись в error_log имеет соответствующую запись в access_log, поэтому с помощью некоторой магии Perl вы можете выполнить работу, но я думаю, что это не стоит усилий, так как это потребует некоторых время для обработки, и это очень подвержено ошибкам.

Вы можете использовать Журнал ошибок директива с конвейером к однострочному сценарию bash - т.е.

ErrorLog "| /script_location 'log destination' 'virtualhost.com'"

... к сценарию:

#!/bin/bash
read INCOMING_LOG && echo ${2}" - "${INCOMING_LOG} >> $1