У меня есть веб-сервер с множеством (тысячами) 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.
Вопросы:
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