目次
Apache のログに関するTIPS
不要なアクセスログを残さない
画像ファイルにアクセスしたログなど、不要なアクセスログを残さないように設定する。
# SetEnvIf # URIの一部の文字列で判定 SetEnvIf Request_URI "\.(gif|jpg|png|css|js)$" nolog # 接続元のIPアドレスで判定 SetEnvIf Remote_Addr 127.0.0.1 nolog # ユーザエージェントで判定 SetEnvIf User-Agent "bot" nolog ~ CustomLog logs/access_log combined env=!nolog
※多くのサイトで正規表現の記述に誤りがあり、必要なログが残っていないことに注意。
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)|(js)$" nolog
これでは、ファイル名の途中に「jpg」「png」などが含まれているページへのアクセスログも記録されない。
ログのフィルタリングの複合
・Game配下へのアクセスは別ファイルに保存したい
・画像のログは取得しない
# SetEnvIf SetEnvIf Request_URI "^/Game/" gamelog SetEnvIf Request_URI "\.(gif|jpg|png|css|js|ico)$" !gamelog
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/games_log.%Y-%m-%d 86400 300" customize env=gamelog
・Game配下へのアクセスにnologという環境変数をつける
・画像のログにnologという環境変数をつける
・nolog以外をaccess_logに記録する
# SetEnvIf SetEnvIf Request_URI "^/Lod/" nolog SetEnvIf Request_URI "\.(gif|jpg|png|css|js|ico)$" nolog
CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400 300" customize env=!nolog
「internal dummy connection」のログが残る
apache の child process を安全に kill する為に擬似的なリクエストを出したときのログ。
特に実害はない。
不要な場合は、以下で対応可能。
# vi /etc/httpd/conf/httpd.conf
以下の記述を994行目付近のログの設定に追加
SetEnvIf User-Agent "internal dummy connection" nolog CustomLog logs/access_log combined env=!nolog
# /etc/rc.d/init.d/httpd restart
シェルスクリプトで任意のタイミングでログローテートする
# vi aplog.sh
#!/bin/sh # バックアップ日付(現在時刻)の取得 BKDATE=`date +%Y%m%d_%H%M%S` # apache のログフォルダに移動 cd /var/log/httpd # 各ログファイルを日付つきにリネーム mv access_log access_log.$BKDATE mv error_log error_log.$BKDATE # apacheを再起動 #apachectl -k graceful ← crontabでは再起動がうまくいかない /etc/rc.d/init.d/httpd restart # 日付つきログファイルを圧縮 gzip access_log.$BKDATE gzip error_log.$BKDATE
実行は、
# sh aplog.sh
または、cron に設定してスケジュールで実行
rotatelogs?loglotate?
Apacheインストール時の標準設定はloglotate。
比較
- rotatelogs
- ローテート実行時にApacheの再起動が不要
- 世代管理を手動(手製スクリプト)で行う必要がある
- loglotate
- ログの世代管理が容易
- ローテート実行時にApacheの再起動が必要
⇒サービス瞬断
⇒APC(キャッシュ)がクリアされる
rotatelogsの設定
# vi /etc/httpd/conf/httpd.conf
~ #ErrorLog logs/error_log ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error_log.%Y-%m-%d 86400 300" ~ #CustomLog logs/access_log timelog env=!no_log CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400 300" timelog
- 86400(秒)
ローテートの間隔。
1日(60sx60mx24h)毎にローテートさせる。
- 300(分)
ローテートの実行時間をUTFをの時差(マイナス)で指定。
UTCの0時は日本時間の9時なので、5時間(60mx5h)前の4時にローテート実行させる。
ハードリンク
Apache Ver2.4x付属のrotatelogsではログファイル実体とは別に固定のファイル名のハードリンクを作成できる。
ローテートの設定でファイル名の後ろに日付をつけて管理するが、外部PG(fluentdなど)からtailで読み込む際の
ファイル名は常に一定にしておきたい、などに使える。
以下、Apache2.4.xから依存関係のない(コピーして他の環境で使える)rotatelogsの取出し方。
- pcre install
公式>http://sourceforge.jp/projects/sfnet_pcre/releases/
インストールされていないと、Apacheのconfigure時に以下のエラー発生する
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
-
# cd /usr/local/src # wget http://downloads.sourceforge.net/project/pcre/pcre/8.32/pcre-8.32.tar.gz?r=http%3A%2F%2Fsourceforge.jp%2Fprojects%2Fsfnet_pcre%2Fdownloads%2Fpcre%2F8.32%2Fpcre-8.32.tar.gz%2F&ts=1362358911&use_mirror=jaist # tar xzvf pcre-8.32.tar.gz # cd pcre-8.32 # ./configure # make # make install
- apache 2.4
# wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.4.4.tar.gz # tar xzvf httpd-2.4.4.tar.gz # cd httpd-2.4.4
- apr,apr-utilダウンロード
# cd srclib # wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-1.4.6.tar.gz # wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-util-1.4.1.tar.gz # tar zxf apr-1.4.6.tar.gz # tar zxf apr-util-1.4.1.tar.gz # mv apr-1.4.6 apr # mv apr-util-1.4.1 apr-util # cd ..
- build
# ./configure --prefix=/path/to/httpd24 --enable-static-rotatelogs --with-included-apr # make
- 設定例
CustomLog "|./rotatelogs -L ./logs/access_log ./logs/access_log.%Y-%m-%d 86400 300" combined
日付フォーマットの変更
標準の日付フォーマット
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
だと以下のように出力される。
[25/Feb/2013:10:23:13 +0900]
内部での定義は、以下のとおり。
[day/month/year:hour:minute:second zone] day = 2*digit month = 3*letter year = 4*digit hour = 2*digit minute = 2*digit second = 2*digit zone = (`+' | `-') 4*digit
e.g.
[2013/02/25 10:41:13+0900]
上記のように表示したい場合は、
[%{%Y/%m/%d %T%z}t]
として、標準の定義の「%t」の部分を書き換える。
LogFormat "%h %l %u [%{%Y/%m/%d %T%z}t] \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" customize