У меня есть рабочая конфигурация виртуального хоста для каждого пользователя с Apache, но я бы хотел, чтобы у каждого пользователя был доступ к журналам для его виртуальных хостов. Очевидно, что директивы ErrorLog и CustomLog не принимают синтаксис с подстановочными знаками, который делает VirtualDocumentRoot, но есть ли способ получить журналы в каталоге каждого пользователя?
<VirtualHost *:80>
ServerName *.example.com
ServerAdmin webmaster@example.com
VirtualDocumentRoot /home/%2/projects/%1
<Directory /home/*/projects/>
Options FollowSymlinks Indexes
IndexOptions FancyIndexing FoldersFirst
AllowOverride All
Order Allow,Deny
Allow From All
Satisfy Any
</Directory>
Alias /favicon.ico /var/www/default/favicon.ico
Alias /robots.txt /var/www/default/robots.txt
LogLevel warn
# ErrorLog /home/%2/logs/%1.error.log
# CustomLog /home/%2/logs/%1.access.log combined
</VirtualHost>
Разрешение: на основе Прекрасный ответ @ cjc Я понял, что мне нужно написать сценарий, чтобы решить эту проблему, и вот что я придумал:
#!/bin/bash
##
# Write whatever comes through stdin to the log directory in each user's home directory.
##
# The first field in the incoming log must be the vhost name
# (%V in the Apache LogFormat).
while read vhost fields; do
# vhost names take the form $project.$user.$host.
project="${vhost%%.*}" # Strip off everything after the first dotted name.
user="${vhost#*.}" # Strip off the first dotted name.
user="${user%%.*}" # Strip off everything but the first (remaining) dotted name.
printf -v cmd "mkdir -p '/home/%s/log' && printf '%%s\n' '%s' >> '/home/%s/log/%s.log'" "$user" "$fields" "$user" "$project"
sudo -u "$user" -- bash -c "$cmd"
done
Я не верю, что вы можете сделать это в самом Apache, но вы можете передать журналы в сценарий, который может разделить его так, как вы пытаетесь сделать:
Взгляните на эту часть документации Apache:
http://httpd.apache.org/docs/2.2/logs.html#piped
Итак, у вас будет такая строка:
CustomLog "|/usr/local/bin/per-user-web-logs.pl" combined
где /usr/local/bin/per-user-web-logs.pl
это, скажем, сценарий Perl, который будет добавляться в нужный журнал для каждого пользователя.