somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【apahe】ログの設定とローテーション

apacheのログ設定とローテーションに関するメモです。

ログに関するモジュール

Linuxではソースからコンパイルしたので分からないですが、Windowsのapache(xampp)では以下のモジュールがhttpd.confに記載されていました。

LoadModule cgi_module modules/mod_cgi.so
#LoadModule logio_module modules/mod_logio.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_forensic_module modules/mod_log_forensic.so

ログレベル

ログレベルは、LogLevelディレクティブで設定します。デフォルトはwarnになっています。指定しているレベル以上のログが出力されるので、アクセス等をすべてとるのであれば、infoに設定すれば問題ありません。

エラーログ

エラーログは、ErrorLogディレクティブで設定します。デフォルトは"logs/error.log(またはerror_log)"になっています。ログファイルのパスは、相対パス絶対パスの両方で指定できます。

エラーログには、CGIスクリプトのエラーログも書き込まれるようです。PHPのエラーログが書き込まれるのはこのため?かと思います。

CGIスクリプトのエラーログは、ScriptLogで設定します。デフォルトでは"logs/cgi.log"ですが、コメントアウトされています。も書き込まれるようです。PHPのエラーログが書き込まれるのはこのため?かと思います。

syslog

エラーログのファイルにsyslogを指定することができます。syslogとは「ログメッセージをIPネットワーク上で転送するための標準規格」だそうです。オプションにファシリティ(ログの扱い方や分類)が存在しますが、よくわかっていないです。

CGIスクリプトのエラーログは、ScriptLogで設定します。デフォルトでは"logs/cgi.log"ですが、コメントアウトされています。も書き込まれるようです。PHPのエラーログが書き込まれるのはこのため?かと思います。

アクセスログ

アクセスログという名前が付いているだけで、基本的にはただのログです。設定は、コンテナ指示子のIfModule、モジュール名log_config_moduleの中で行っています(<IfModule log_config_module>)。

 LogFormat "%h %l %u %t \"%r\" %>s %b" common
 CustomLog "logs/access_log" common

ログフォーマット

アクセスログのフォーマットは、commonという名前が付けられています。

commonの内容は、以下のとおりです。その他のフォーマットについてはマニュアル参照(http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html)。

  • リモートホスト
  • クライアントの識別子(⇒よくわかっていない・・・)
  • 認証ユーザ名(⇒よくわかっていない・・・)
  • 時刻
  • リクエストの最初の行(\"はエスケープ)
  • 最後のレスポンスのステータス(リダイレクトされたことを考慮している)
    %sの場合、最初のステータスのみを表示
  • レスポンスのバイト数(ヘッダーは含まないで、0バイトの時は-と表示)

以下のように出力されます。

192.168.128.1 - - [21/Jan/2012:17:10:25 +0900] "GET /favicon.ico HTTP/1.0" 404 209

フォーマットの名前は、あとで使用するのでつけておきましょう。

修飾子

%400,501{User-agent}iや、%!200,304,302{Referer}iのように、ステータスを指定することもできます。!は否定を表し、それら以外の場合に出力されるようになります。

ローテンション

アクセスログなどを1ファイルで管理していると、ファイル容量が膨大になりすぎ、ファイルを利用するときにとても困ります。これを解決するためにapacheに付属で付いているrotatelogsを用います。以下のように設定します。

CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/${HOSTNAME}/access_log.%Y-%m-%d 86400" common
CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/${HOSTNAME}/access_log.%Y-%m-%d 10M" common
  • CustomLogはログフォーマットを使用するために用いています
  • 末尾の名前がフォーマット名
  • ファイル名を""で囲む
  • 出力を処理するプログラムに渡すため、先頭にパイプがある
  • rotatelogsまでのパスを指定する(Windowsは同名のexeファイル)
  • その後ろにファイル名を記載する
  • ファイル名には日付フォーマットを使用できる
  • ローテーションする秒数を記述する⇒例は一日単位
  • ローテーションするファイルサイズを記述する⇒切り替わった時のファイル不明・・・
  • エラーログにもローテーション適用可能

日付のフォーマットは以下のとおりです。

記号出力内容備考
a曜日文字列省略名
A曜日文字列
b文字列省略名
B文字列
c日付および時刻文字列
d日付01~31
H00~23
i01~12
j001~366
m01~12
M00~59
p午前・午後amまたはpm
S00~59
Uその年の日曜日を第一週とする
w曜日0~6(日~)
Wその年の月曜日を第一週とする
x日付文字列
X時刻文字列
y西暦下2桁
Y西暦4桁
Zタイムゾーン文字列
%パーセントのエスケープ