1

複数のユーザーが mod_userdir を使用して Web 開発を練習するための LAMP サーバーを構築しており、ユーザーのホーム ディレクトリ内のログ ディレクトリにアクセス ログとエラー ログを分割するスクリプトを作成しました。

access_log.sh スクリプトは正常に動作していますが (ログ行はメイン サーバー ログ ファイルとユーザーのログ ファイルの両方に書き込まれます)、error_log.sh はメイン ログ ファイルのみを更新しています。これは error_log.sh です:

#!/bin/bash

IFS='
'

userlogfile=error.log
syslogfile=/var/log/apache2/cs-web_error.log

homedirs=`ls -d /home/*`

while read logline; do
    echo -e ${logline} >> ${syslogfile}
    #echo -e "writing ${logline} to ${syslogfile}" #TESTING

    for homedir in $homedirs; do
        userlogpath="${homedir}/logs/${userlogfile}"
        if echo $logline | grep ${homedir} > /dev/null; then
            echo -e ${logline} >> ${userlogpath}
            #echo -e "writing ${logline} to ${userlogpath}" #TESTING
        fi
    done
done

Apache のロギング構成は次のとおりです。

CustomLog "| ${APACHE_LOG_DIR}/access_log.sh" common
ErrorLog "| ${APACHE_LOG_DIR}/error_log.sh"

#TESTING ステートメントのコメントを外すと、スクリプトを介してエラー ログをパイプすると、次のような出力が得られます。

writing [Fri Sep 06 12:15:11 2013] [error] [client 193.61.230.178] PHP Parse error:
syntax error, unexpected 'select' (T_STRING) in /home/ginny/htdocs/test.php on line 12 
to /var/log/apache2/cs-web_error.log
writing [Fri Sep 06 12:15:11 2013] [error] [client 193.61.230.178] PHP Parse error:  
syntax error, unexpected 'select' (T_STRING) in /home/ginny/htdocs/test.php on line 12 
to /home/ginny/logs/error.log

... これは、grep ステートメントが機能していることを示しています。また、このように手動で実行すると、ファイルが作成されて次の場所に書き込まれます。

root@cs-web:~# ls -l /home/ginny/logs/
total 16
-rw-r--r-- 1 root root 2213 Sep  6 12:53 access.log
-rw-r--r-- 1 root root 9984 Sep  6 12:49 error.log

私が理解するのに苦労しているのは、これがエラーログではなくアクセスログで機能する理由です-唯一の違いは次のとおりです。

root@cs-web:/var/log/apache2# diff access_log.sh error_log.sh
6,7c6,7
< userlogfile=access.log
< syslogfile=/var/log/apache2/cs-web_access.log
---
> userlogfile=error.log
> syslogfile=/var/log/apache2/cs-web_error.log
12a13
>     #echo -e "writing ${logline} to ${syslogfile}"
15,17c16,17
<         homedir=${homedir#/home/}
<         userlogpath="/home/${homedir}/logs/${userlogfile}"
<         if echo $logline | egrep "/(~|users/)${homedir}/" > /dev/null; then
---
>         userlogpath="${homedir}/logs/${userlogfile}"
>         if echo $logline | grep ${homedir} > /dev/null; then
18a19
>             #echo -e "writing ${logline} to ${userlogpath}"

感謝して受け取った提案。

4

1 に答える 1