ユーザ用ツール

サイト用ツール


apache:log_tips

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

参考

apache/log_tips.txt · 最終更新: 2014/02/26 07:08 by clownclown

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki