====== 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 または、[[CentOS:cron の設定|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:ログのTIPS:rotatelogs.png}} ==== ハードリンク ==== 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 ==== 参考 ==== [[http://httpd.apache.org/docs/2.0/ja/logs.html|apache log]] [[http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strftime.3.html|STRFTIME]]