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

Apache: автоматическое разделение журнала на виртуальный хост?

Всякий раз, когда мы создаем новые виртуальные хосты на наших серверах разработки, мы всегда должны вручную указывать отдельные журналы доступа и ошибок:

ErrorLog logs/mysite/dev1-error.log
CustomLog logs/mysite/dev1-access.log "common"

Есть ли способ заставить Apache автоматически разделять журналы вместо того, чтобы указывать их каждый раз?

Я чувствую вашу боль, как веб-разработчик, у меня, вероятно, более 200 vhosts в моем локальном разработчике - я лично не забочусь о журналах и записываю их все в основной / var / log / apache ...

Однако я написал сценарий оболочки для добавления / управления всеми моими vhosts - все, что вам нужно сделать, это настроить его, чтобы писать журналы куда угодно ...

#!/bin/bash
ARGS=1
if [ "$1"X = "X" ];
        then
        echo "Must enter domain name"
        exit 0
fi
if [ "$2"X = "X" ];
        then
        echo "Must enter domain suffix"
        exit 0
fi
if [ "$3"X = "X" ];
        then
        echo "you must type "restart" if you want apache restarted "no" if not!"
        exit 0
fi

domain=$1.$2;

#echo $domain;
#exit 0


rm $domain.conf

echo "<VirtualHost *:80>" >> $domain.conf;
echo "        ServerAdmin no-reply@network.local" >> $domain.conf;
echo "        ServerName $1.network.local" >> $domain.conf;
echo "        DocumentRoot /Data/vhome/$1.$2/httpdocs" >> $domain.conf;
echo "        HostnameLookups Off" >> $domain.conf;
echo "        UseCanonicalName Off" >> $domain.conf;
echo "        ServerSignature On" >> $domain.conf;
echo "        ScriptAlias /cgi-bin/ "/Data/vhome/$1.$2/cgi-bin/"" >> $domain.conf;
echo "        ErrorLog /var/log/apache2/error_log" >> $domain.conf;
echo "        CustomLog /var/log/apache2/access_log combined" >> $domain.conf;
echo "    <Directory "/Data/vhome/$1.$2/cgi-bin">" >> $domain.conf;
echo "        AllowOverride All" >> $domain.conf;
echo "        Options +ExecCGI -Includes" >> $domain.conf;
echo "        Order allow,deny" >> $domain.conf;
echo "        Allow from all" >> $domain.conf;
echo "    </Directory>" >> $domain.conf;
echo "    <Directory "/Data/vhome/$1.$2/httpdocs">" >> $domain.conf;
echo "        Options Indexes FollowSymLinks" >> $domain.conf;
echo "        AllowOverride All" >> $domain.conf;
echo "        Order allow,deny" >> $domain.conf;
echo "        Allow from all" >> $domain.conf;
echo "    </Directory>" >> $domain.conf;
echo "       # #XSS prevention" >> $domain.conf;
echo "       # RewriteEngine On" >> $domain.conf;
echo "       # RewriteCond %(REQUEST_METHOD) ^TRACE" >> $domain.conf;
echo "       # RewriteRule .* -[F]" >> $domain.conf;
echo "</VirtualHost>" >> $domain.conf;

if [ "$3" = "restart" ];
        then
        rcapache2 restart;
fi

chmod 666 $domain.conf

cat $domain.conf
echo "Created!";

exit 0

Надеюсь, поможет.

-шон

Еще варианты. Не разделяйте их в httpd.conf. Вместо этого записывайте все в свой основной журнал доступа, а затем разделите их позже с помощью такой программы, как разделенный файл журнала. Это помогает упростить настройку журнала.

Это описано в http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Добавив информацию о виртуальном хосте в строку формата журнала, можно записать все хосты в один журнал, а затем разбить журнал на отдельные файлы. Например, рассмотрим следующие директивы.

LogFormat "%v %l %u %t \"%r\" %>s %b" comonvhost CustomLog
logs/access_log comonvhost

% V используется для регистрации имени виртуального хоста, обслуживающего запрос. Тогда программа вроде разделенный файл журнала может использоваться для последующей обработки журнала доступа, чтобы разделить его на один файл для каждого виртуального хоста.

Когда я еще использовал apache, я научился трюку у коллеги. Он передал журнал глобального доступа через awk сценарий. В awk скрипт, в свою очередь, позаботится о создании различных файлов журналов.

В httpd.conf:

LogFormat "%V %p %a %l %u %t \"%r\" %s %b \"%200{Referer}i\" \"%200{User-agent}i\" \"%{cookie}n\"" awklogpipe
CustomLog "|/usr/local/bin/apacheawklogpipe" awklogpipe env=!dontlog

Скрипт / usr / local / bin / apacheawklogpipe:

#!/bin/gawk -f

BEGIN {
        months["Jan"] = "01";
        months["Feb"] = "02";
        months["Mar"] = "03";
        months["Apr"] = "04";
        months["May"] = "05";
        months["Jun"] = "06";
        months["Jul"] = "07";
        months["Aug"] = "08";
        months["Sep"] = "09";
        months["Oct"] = "10";
        months["Nov"] = "11";
        months["Dec"] = "12";
}

{
        # HEADS UP: SET THIS!!!!
        LOGBASE="/var/log/httpd/access"

        SSL=""

        # Automagicly set first 
        SITE=tolower($1);
        PORT=$2

        if ($2 == 443)
        {
                SSL="-ssl"
        }

        # Extract all but first two fields (vhostname vhostport to be exactly) into LINE
        LINE=substr($0,index($0,$3));

        # No matter where it is, we will find an apache datestamp.
        match(LINE,/\[[0-9]+\/[A-Z][a-z]+\/[0-9]+:[0-9]+:[0-9]+:[0-9]+[\t ]+[+-][0-9]+\]/);
        split(substr(LINE,RSTART + 1,RLENGTH - 2), ap_log_time, /[\/: ]/);

        #ap_rotatelog= LOGBASE "/" SITE ":" PORT "/access-log" SSL "-" ap_log_time[3] "-" months[ap_log_time[2]] ap_log_time[1];
        ap_rotatelog= LOGBASE "/" SITE  "/access_log" SSL;
        if (system("test -d " LOGBASE "/" SITE ) == 0)
        {
                print LINE >> ap_rotatelog;
                close(ap_rotatelog);
        }
        else
        {
                print SITE "\t" SSL "\t" LINE >> LOGBASE "/w3logrotate-error.log";
                close(LOGBASE "/w3logrotate-error.log");
        }
}

Убедитесь, что / usr / local / bin / apacheawklogpipe является исполняемым. Все, о чем вам нужно будет позаботиться с этим скриптом, - это создать каталог в /var/log/httpd/access что соответствует имени виртуального хоста. У меня был сценарий, который создавал конфигурацию виртуального хоста и каталоги журналов.

Может взглянуть на mod_macro. Это более общий подход, но я думаю, что это могло бы помочь вам и в другом случае.