About connecting the dots.

data science related trivial things

Apacheログのフォーマットと各項目の意味

最近LTSVが界隈でブームな訳ですが,そういやAPacheログのフォーマットってちゃんと理解していなかったなと思って,きちんと調べなおしてみました.というわけで,今回は自分の備忘録的なメモということで.

Apacheログの設定

ログの形式は,Apacheの設定ファイルであるhttpd.confに,そのままログf−マットを記載する形で指定します.特に何の指定もしない場合のデフォルトのフォーマットは,Common Log Formatというもので,以下のようなログが出力されるわけです.

192.168.130.xxx - - [01/Sep/2001:08:36:16 +0900] "GET http://www5.plala.or.jp/vaio0630/index.htm HTTP/1.0" 200 18167

で,これをApacheログの設定記法であえて書いてみると,こんな形になるわけですね.

LogFormat "%h %l %u %t \"%r\" %s %b"

それぞれの項目の意味は,次の通りです.

項目名 表記法 意味
ホスト名 Host %h 訪問者のIPアドレスまたはドメイン名
識別情報 Ident %l クライアントについての識別情報
認証ユーザー Authuser %u 基本HTTP認証が必要な場合の認証済みユーザー名
日時 Date %t リクエストの日時
リクエスト Request %r 送信してきたリクエストの内容。この部分は、"と"で囲まれる
ステータス Status %s クライアントに送信されたHTTPステータスコード
バイト数 Bytes %b クライアントに送信されたファイルやオブジェクトのサイズ

また,それ以外にも以下のような項目があって,先ほどのログフォーマットに書き加えることで,いろいろなパラメタを指定することができます.

項目名 表記法 意味
リクエストファイル %f リクエストされたファイル名
リモートIP %a リクエストを送信してきたコンピュータのリモートIPアドレス
リファラ %{Referer}i リファラ
ユーザエージェント %{Referer}i リクエストを送信してきた端末のユーザエージェント
ポート %p リクエストに応えるサーバーのポート
プロセスID %P リクエストに応えた子プロセスID
アクセス時間 %t format書式に従って表現された時間
レスポンスタイム %T リクエストに応えるために要した時間(秒)
サーバ名 %v リクエストの送信先となったサーバーの名前

Apahceログの記法

基本的な記法

上記の表記法には,いくつかのパターンがあったかと思います.まず第一のパターンは「% + アルファベット」というもので,これは基本的に特定のアルファベットが特定のパラメタを意味しているわけです.そして,表記法も基本的には固定なわけです.

しかし中には,記法をある程度自由に設定することができる項目もあります.先ほども紹介した%tで,これを以下のように,

%{format}t

とかけば,中に記述したフォーマットで時刻の出力を行ってくれます.たとえば以下のような設定をすれば,

%{%Y-%m-%d %H:%M:%S %Z}t

こんな形で値が出力されるわけです.

2013-02-16 17:58:09 JST

任意の値を出力

ここまで説明してきたのは,基本的なパラメタの出力なわけですが,実際にウェブアプリなんかをつくってみると,いろんな付加情報を合わせて出力したくなってくるわけです.たとえば会員番号をログに出力して,ユーザ個々人の行動をトレースしたいとか.そういったときには,リクエストヘッダに会員番号をくっつけてリクエストを飛ばしてあげて,それをサーバ側で読み取って,ログに吐ければよいわけです.

ということで,以下のように指定することで,リクエストヘッダ,レスポンスヘッダの値を出力することができるようになります.さらに,それ以外の環境変数も入れこむことができます.

表記法 意味
%{Hoge}i リクエストヘッダのHogeの中身を出力.先ほどのユーザエージェントやリファラにもこの記法を使っていたが,それらの値がリクエストヘッダに含まれているためである
%{Hoge}o レスポンスヘッダFoobarの内容
%{FOOBAR}e 環境変数FOOBARの値

ということで,基本的な知識確認でした.