Всякий раз, когда мы создаем новые виртуальные хосты на наших серверах разработки, мы всегда должны вручную указывать отдельные журналы доступа и ошибок:
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. Это более общий подход, но я думаю, что это могло бы помочь вам и в другом случае.