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

Ведение журнала виртуального хоста для каждого пользователя

У меня есть рабочая конфигурация виртуального хоста для каждого пользователя с 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, который будет добавляться в нужный журнал для каждого пользователя.