さて,これまではVirtualHostのお話をしてきました。
ここまでの設定の方法では,DocumentRootは別でもaccess_logはすべて共通のものになっていました。確かにアクセスが少ない段階であれば同一のログでも,とくに問題はないでしょう。しかしながら,各Hostがアクセスが増えてくるとログをそれぞれに分割したり,フォーマットをそれぞれ分けたりするような要望もでてくるのではないでしょうか。
今回はそのような要望を実現することができる,access_logの設定方法の説明をしていきたいと思います。
access_logで使われるモジュール
Apacheを運用する際は,一般的に2種類のログを出力して運用します。ユーザからのリクエストごとに出力されるaccess_logと,apacheのエラーを出力するerror_logです。
access_logはmod_log_configというモジュールによって拡張された機能です。柔軟なカスタマイズが可能なモジュールです。まずここではカスタマイズ方法を確認していきましょう。
access_logの設定方法
サンプルで用意している,httpd.confの91行目~96行目までを見てください。
91: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
92: LogFormat "%h %l %u %t \"%r\" %>s %b" common
93: LogFormat "%{Referer}i -> %U" referer
94: LogFormat "%{User-agent}i" agent
95:
96: CustomLog logs/access_log common
※ 実際には行番号は付いていません
ここで,それぞれログのフォーマットとログファイルの設定を行っています。
まず,LogFormatというディレクティブを見てください。ここのディテクティブでは,スペース区切りでログのフォーマットとnicknameと呼ばれるものを設定しています。mod_log_configではよく使われるログフォーマットを1度だけnicknameを使って定義しておくことができます。あとから利用したいときは,そのnicknameを使って呼び出せば良いようになっています。
なお,上記の設定は標準的に入っている設定です。追加の設定が必要な場合は下記のページを参考にして追記してください。
次に,CustomLogです。
ここでは,第1引数にログのパス,第2引数にログフォーマットを記述します。ログのパスを/(スラッシュ)から始めるとフルパスでの指定,つけないとapache_rootからの相対パスの指定になります。第2引数には,直接ログのフォーマットを記述することもできます。また,複数設定を使いまわしたい場合は先ほど定義したnicknameを使うと便利です。
それでは,具体的にsampleからもう一度見てみましょう。
92行目と96行目に注目してください。まず92行目では,1つ目の引数で定義したログのフォーマットをcommonというnicknameを付けています。それを96行で,commonというnicknameを呼び出しています。
また,この設定はVirtualHostごとに設定をいれることができます。LogFormatをVirtualHostの外で設定して,VirtualHost内ではCustomLogでその設定を呼び出すといった使い方が良いでしょう。
フォーマットを変更してみる
それでは,ためしに新しいnicknameを使ってログを定義してみましょう。まず,下記の2行をhttpd.confに追加してください。
LogFormat "Timer=>> %T" timer
CustomLog logs/access_log_timer timer
ではapacheを再起動かけてログを確認してみましょう。
$ sudo /usr/local/apache2/bin/apachectl restart
$ tail -F /usr/local/apache2/logs/access_log_timer
Timer=>> 0
上記のようにログは出力されましたか?簡素なログではありますが,変化を確かめるにはちょうど良いかと思います。実際に利用する際は,ゼロからかくと大変なのでcombinedのフォーマットを元に追加をするようにすると良いでしょう。
[TIPS]rotatelogsを使って簡単rotate
ログを利用していると,問題となってくるのがログのrotateです。
ログのサイズが2GBを超えてしまってApacheが落ちてしまったという経験をされたことがある方もいるのではないでしょう。
独自にscriptを用意しても良いですが,Apacheに標準でrotatelogsというスクリプトが付属してきます。こちらを使うのが最も手っ取り早い方法でしょう。使い方は簡単です。
下記の1行を追加してみてください。これで日付ごとにlogファイルをrotateすることができます。
CustomLog "| /usr/local/apache2/bin/rotatelogs -l logs/access_log.%Y%m%d 86400" common
ただし,ファイルの圧縮や削除は自動的にやってくれませんので注意してください。
最後に
さて,ログのフォーマットを理解することはできましたか? アプリケーションの特性によっては,取得すべきログなども変わってくる可能性があります。デフォルトのまま使っているとあまり意識しない部分ですが,いざというときに調査が必要な場合があるので一度見直してみましょう。