Apacheのログ設定

最終更新日時:2009-05-29 00:00:00
Apache

ログ設定について


Apache は access_log や error_log といったログを出力することができ、デフォルトで出力されるように設定されています。
が、これをデフォルトのまま出力していると、ログ解析で不都合が出たり、ログが延々と出力されてしまって巨大になったりといろいろ問題が起きます。
従って、まともに Apache を使おうと思ったらログ関連の設定をカスタマイズする必要があります。

アクセスログ出力設定


まずは簡単に基本事項を。
アクセスログの出力設定は、CustomLog ディレクティブによって設定をします。
これはデフォルトでも設定されています。
設定例:アクセスログを /usr/local/apache/logs/access_log に common 形式で出力

 CustomLog /usr/local/apache/logs/access_log common


エラーログ出力設定


もう一つ基本事項を。
エラーログの出力設定は、ErrorLog ディレクティブによって設定をします。
これもデフォルトでも設定されています。
設定例:エラーログを /usr/local/apache/logs/error_log に出力

 ErrorLog /usr/local/apache/logs/error_log


アクセスログの形式を変更する


ログ解析をしたりするのであれば、アクセスログの形式をそのログ解析に対応したものにしなければなりません。
ログの形式はデフォルトでは common 形式に設定されていますが、たいていのログ解析では combined 形式を使用しますので、基本的には combined 形式に変更しておいた方が無難です。
また、ホスティングのようにマルチドメインな Web サーバである場合には、個々のドメインごとに VirtualHost 内でログ出力設定を記述するよりも、以下のようにマルチドメインに対応したアクセスログ形式を設定した方がよい場合が多いです。

 LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined


ログローテート


デフォルトの状態では永久的にログを出力し続けるのでそのうち巨大なファイルになり果ててしまいます。
従って、ログを一定時間ごとにローテートする必要があります。
Linux 等の OS で標準でインストールされる logrotate 等を使っても可能なのですが、Apache ではもっと便利なログローテート用のコマンドが用意されています。
例えば以下のように設定すると、access_log.YYYYMMDD といった形式で日ごとにファイルを生成してアクセスログを出力していきます。

 CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%Y%m%d 86400 540" vcombined
 ErrorLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/error_log.%Y%m%d 86400 540"


※ 86400 (1日の秒数)はローテートの間隔、540 は UTC からのオフセット

WORM 対策


アクセスログには基本的に全てのアクセス、例えば WORM の類のようなものも記録されます。
以下のようにするとアクセスの種類によってアクセスログの出力先を変更することができます。

 SetEnvIf Request_URI _vti_ worm
 CustomLog "|/usr/local/apache/bin/rotatelogs /logs/access_log.%Y%m%d 86400 540" combined env=!worm
 CustomLog "|/usr/local/apache/bin/rotatelogs /logs/worm_access_log.%Y%m%d 86400 540" combined env=worm


_vti_worm 以外にも root.exe やら何やらを SetEnvIf で設定しておけば様々な WORM に対応できます。

WORM 対策その2


WORM の中には IP アドレスでアタックしてくるものがけっこうあり、そのようなタイプにたいしては VirtualHost で URL が IP アドレス専用の設定をすることでログの出力を分けることが可能です。
ただし、この場合、有効な URL のドメインについてはすべて VirtualHost で明示的に設定しなければなりません。
インターネット上でのサービスを行っているのであれば、WORM 向けの設定をしておくのもよいかも。

 NameVirtualHost *
 <VirtualHost *>
    ServerName worm.net
    CustomLog "|/usr/local/apache/bin/rotatelogs /logs/worm_access_log.%Y%m%d 86400 540" combined
    ErrorLog "|/usr/local/apache/bin/rotatelogs /logs/worm_error_log.%Y%m%d 86400 540"
    <Location />
        Order deny,allow
        Deny from all
    </Location>
 </VirtualHost>
 <VirtualHost *>
    ...
 </VirtualHost>


上記のように URL が IP アドレスである場合の設定を先頭のVirtualHostに記述し、その後に各ドメインの VirtualHost 設定を記述します。
これは、VritualHost は ServerName でのマッチングに失敗した時には一番最初に記述された VirtualHost の設定を使用する特性を利用しています。

お問い合わせは 掲示板 にて。