Apache のカスタムログ設定
Apache のログを見てみると思うことなのですが、ログファイル自体がかなり膨大になります。
その中には、画像ファイルへのリクエストまでの記録されています。
そして、自分のデバッグの際のアクセスも記録されます。
これらのアクセスの記録はあまり重要ではありませんので、ログ採取を行わない様に設定します。
(もちろん、サイトによっては重要な情報です。)
採取するログを限定する事で、ログの内容を解析しやすくなります。
そして、ごく微量だとは思いますが、Apache のパフォーマンスも向上するかもしれません。
ページ内コンテンツ一覧
Apache のログには画像ファイルへのリクエストも記録されます。
サイトによっては重要な情報ですが、私の様なサイトでは、「どのファイルにアクセスがあるのか」という情報の方が重要です。
デフォルトのログ設定のままですと、例えば「 index.html 」に「 001.gif 」と「 002.gif 」2つの画像があるとすると記録されるログは以下の3行になります。
999.99.99.99 - - [27/Jul/2003:04:03:48 +0900] "GET /index.html HTTP/1.1" 200 6826 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
999.99.99.99 - - [27/Jul/2003:04:03:49 +0900] "GET /001.gif HTTP/1.1" 200 38430 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
999.99.99.99 - - [27/Jul/2003:04:03:49 +0900] "GET /002.gif HTTP/1.1" 200 44816 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
上記のログで、画像に対してまで記録すると、ログファイルがすぐに一杯になりますので、画像ファイルへのリクエストに対してログを記録しない様に設定します。
ここでは、「 mod_setenvif 」というモジュールを使用します。
Vine Linux のデフォルトでは標準でインストールされますが、念のため httpd.conf ( フルパスは /etc/httpd/conf/httpd.conf )に以下の記述がある事を確認します。
LoadModule setenvif_module modules/mod_setenvif.so
AddModule mod_setenvif.c
確認ができたら、具体的に設定して行きます。
httpd.conf の中に画像ファイルのログ採取に関する以下の記述を追加します。
環境変数「 no_log 」の中にログ採取しないファイルの拡張子を記述します。
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
追加する場所は Addmodule 以下ならどこでも構いませんが、LogFormat や CustomLog の記述がある辺りが後で見て分かりやすいと思います。
次に CustomLog に関する記述を編集します。
具体的には以下の様に編集します。
デフォルトの記述
CustomLog /var/log/httpd/access_log combined
以下の様に変更します
CustomLog /var/log/httpd/access_log combined env=!no_log
設定ができたら、Apache を再起動し、変更を反映させます。
この様に記述を変更する事で、環境変数「 no_log 」に該当するものを除外してログ採取します。
Apache のログには全てのアクセスに対し、ログ採取を行います。
ログファイルを見ると分かるのですが、自分でのアクセスが一番多いですよね。
自分から(または同一 LAN 内)からのアクセスは余り必要ではないので、ログを記録しない様に設定します。
それでは具体的に設定して行きます。
httpd.conf 中の LogFormat や CustomLog の記述がある辺りに以下の記述を追加します。
SetEnvIf Remote_Addr 192.168.0. no_log
CustomLog /var/log/httpd/access_log combined env=!no_log
こうする事により 192.168.0.* からのアクセスは一切ログを記録しません。
もうお気づきだとは思いますが、前項の「 画像ファイルへのアクセスを記録しない 」の中の環境変数である「 no_log 」と同一です。以下の様に記述すると、2つの SetEnvIF の内容が反映されます。
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
SetEnvIf Remote_Addr 192.168.0. no_log
CustomLog /var/log/httpd/access_log combined env=!no_log
上記の方法を利用して、Worm のログを別のログファイルに採取する事も可能です。
ここでは、先述の画像に関する事と、特定のホストに関するログとも併せて記述してみました。
# 画像ファイルへのログ採取をしない
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)$" no_log
# 特定のホストからのアクセスはログ採取しない
SetEnvIf Remote_Addr 192.168.0. no_log
# Worm に関するログは別ファイルに記録します
SetEnvIf Request_URI "^/_mem_bin/" worm no_log
SetEnvIf Request_URI "^/_vti_bin/" worm no_log
SetEnvIf Request_URI "^/c/" worm no_log
SetEnvIf Request_URI "^/d/" worm no_log
SetEnvIf Request_URI "^/msadc/" worm no_log
SetEnvIf Request_URI "^/MSADC/" worm no_log
SetEnvIf Request_URI "^/scripts/" worm no_log
SetEnvIf Request_URI "^/default.ida" worm no_log
SetEnvIf Request_URI "root\.exe" worm no_log
SetEnvIf Request_URI "cmd\.exe" worm no_log
SetEnvIf Request_URI "NULL\.IDA" worm no_log
# no_log に該当しないものを access_log に記録
CustomLog /var/log/httpd/access_log combined env=!no_log
# worm に該当するものを worm_log に記録
CustomLog /var/log/httpd/worm_log combined env=worm
ログファイルを別で用意する場合は、ログローテーションを設定します。
/etc/logrotate.d/apache に以下の記述を追加します。
「 { 」の位置は必ず 1 行目に書かなくてはいけません。
2行目に書くとログローテのエラーになりますのでご注意下さい。 - 2003/09/12 修正
/var/log/httpd/worm_log { missingok postrotate /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true endscript }
これで、ログローテーションが適応されます。
上記のスクリプトが追加&上書き保存が出来たら正常に動作するかを確認しましょう。
確認は以下のコマンドで可能です。
エラーが無い場合
# /usr/sbin/logrotate -f /etc/logrotate.d/apache
# ←何も表示されません
エラーが存在する場合
# /usr/sbin/logrotate -f /etc/logrotate.d/apache
error: apache:31 { expected after log file name(s) ←エラーの内容が表示されます