web-dev-qa-db-ja.com

Apache:仮想ホストごとの自動ログ分割?

開発サーバーで新しい仮想ホストを作成するときは常に、個別のアクセスログとエラーログを手動で指定する必要があります。

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

毎回ログを指定する代わりに、Apacheがログを自動的に分割するようにする方法はありますか?

6
Jake Wilson

Web開発者として、ローカル開発者にはおそらく200を超えるvhostがあります。個人的にはログを気にせず、すべてをメインの/ var/log/Apacheに記録します...

しかし、私がしたことは、すべてのvhostを追加/管理するシェルスクリプトを作成することでした-あなたがする必要があるのは、好きな場所にログを書き込むようにそれを微調整することです...

#!/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 [email protected]" >> $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

それが役に立てば幸い。

-ショーン

3
Sean Kimball

まだ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が実行可能であることを確認してください。このスクリプトで処理する必要があるのは、virtualhostnameに対応するディレクトリを/var/log/httpd/accessに作成することだけです。仮想ホスト構成を作成し、ログディレクトリを作成するスクリプトがありました。

2
Sgaduuw

別のオプション。 httpd.confでそれらを分割しないでください。代わりに、すべてをメインのアクセスログに記録し、後で split-logfile のようなプログラムで分割します。これは、ログ構成を簡素化するのに役立ちます。

これは 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は、リクエストを処理している仮想ホストの名前をログに記録するために使用されます。次に、 split-logfile のようなプログラムを使用して、アクセスログを後処理し、仮想ホストごとに1つのファイルに分割できます。

2

たぶん mod_macro を見てください。これにはより一般的なアプローチがありますが、それ以外の場合にも役立つと思います。

0
Sven