Использование отдельных файлов логов Apache для мультисайта

6 апр. 2012 г., 03:36:39
Просмотры: 1.48K
Голосов: 3

Некоторое время назад я ушел с 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.

0
Все ответы на вопрос 1
5

Вы можете настроить пользовательские логи в вашем 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
6 апр. 2012 г. 04:05:04
Комментарии

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

Synetech Synetech
6 апр. 2012 г. 04:08:18

Я добавил пример для поддиректорий. Не тестировал, просто идея.

fuxia fuxia
6 апр. 2012 г. 04:16:06

Хм, я понимаю, что ты делаешь. Попробую это.

Synetech Synetech
6 апр. 2012 г. 04:17:54

@Synetech Это сработало?

fuxia fuxia
6 окт. 2012 г. 22:17:48

Нет, не сработало; логи были пустыми. Я тестирую, может ли помочь использование директивы <If>, но для этого требуется обновление до версии 2.3+.

Synetech Synetech
13 окт. 2012 г. 18:41:48