Использование отдельных файлов логов Apache для мультисайта
Некоторое время назад я ушел с Blogger и загрузил свои блоги на свою систему. Я размещал их там, используя каждый отдельный блог как VirtualHost. Позже я импортировал их в WordPress и теперь размещаю их через WP.
Когда я размещал их локально как виртуальные хосты, у каждого был свой файл логов Apache, но теперь все блоги пишутся в один файл.
Я не могу найти настройку в WordPress, и нет возможности указать это в файле .htaccess
, так как сайты виртуальные. То есть блоги WordPress фактически не расположены на диске как отдельные каталоги (кроме того, настройки логов нельзя использовать в .htaccess
).
Как можно настроить мультисайт WordPress так, чтобы один или несколько сайтов писали логи в свои собственные файлы?
Второе предложение toscho об использовании SetEnvIf выглядит перспективным. Мне удалось настроить запись доступа к одному сайту в отдельный файл лога и исключить его из основного лога с помощью следующих директив:
…
<IfModule log_config_module>
…
# Я повторно использую переменную среды dontlog, так как нет причин создавать специальную переменную (для меня), это позволяет избежать использования выражения (плюс, это просто логично)
SetEnvIf Request_URI "^/blogs" dontlog
SetEnvIf Request_URI "^/blogs/blog1" blog1
SetEnvIf Request_URI "^/blogs/foobar" foobar
…
CustomLog "../Logs/Main/access.log" common env=!dontlog
CustomLog "../Logs/Blogs/blog1.log" common env=blog1
CustomLog "../Logs/Blogs/foobar.log" common env=foobar
…
UnsetEnv dontlog
UnsetEnv blog1
UnsetEnv foobar
</IfModule>
…
Это работает для одноблогового сайта, но для мультисайта проблема в том, чтобы избежать загромождения и упростить добавление новых блогов, так как похоже, что нельзя использовать переменные в именах файлов логов следующим образом, что означает необходимость создавать отдельную запись для каждого блога:
…
<IfModule log_config_module>
…
SetEnvIf Request_URI "^/blogs" dontlog
# Установка переменной среды в соответствии с именем блога из подвыражения регулярного выражения
SetEnvIf Request_URI "^/blogs(.+/)" blog=$1
…
CustomLog "../Logs/Main/access.log" common env=!dontlog
CustomLog "../Logs/Blogs/%{blog}e.log" common env=blog
…
UnsetEnv dontlog
UnsetEnv blog
</IfModule>
…
В итоге я получаю лог со всеми обращениями к блогам в файле с именем %{blog}e.log
.

Вы можете настроить пользовательские логи в вашем httpd-vhosts.conf
в зависимости от переменной HTTP_HOST
– если ваш сервер Apache использует поддомены для каждого сайта.
Для поддиректорий (не тестировалось):
SetEnvIf Request_URI ^sitename1 sitename1
SetEnvIf Request_URI ^sitename2 sitename2
CustomLog sitename1.log common env=sitename1
CustomLog sitename2.log common env=sitename2

Как я уже говорил, это то, что я делал до перехода на WordPress. Сейчас это не сработает, потому что сайты в wpmu не существуют в виде папок на диске или виртуальных хостов в Apache: blah.com/blogs/foo
, blah.com/blogs/bar
.
