[ 先頭 | 上へ | 前へ | 次へ | 目次 | 索引 ]

Analog 5.91beta1: ログファイルのフォーマット


この章では、Analog にログファイルのフォーマットを認識させる方法について説明します。 Analog は自動的にフォーマットを認識するので、ほとんどの人にとってこの作業は不要です。まずは解析させてみて、認識するかどうかを確かめてみてください。これでかなりのトラブルを回避できるはずです。しかし、明示的にログファイルのフォーマットを指定する必要があるときは、以下で説明する方法を参照してください。

ログファイルのフォーマットを指定するための基本的なコマンドは、以下のようになります。

LOGFORMAT format
format としてとり得る値については、この後すぐに説明します。Apache サーバを使っている場合は、このコマンドの代わりに以下のコマンドを使うと便利でしょう。
APACHELOGFORMAT apacheformat

LOGFORMATAPACHELOGFORMAT コマンドは、同じ 設定ファイル内で、このコマンドよりも後に記述された LOGFILE コマンドで指定されるログファイルにのみ適用されます。 そのため、LOGFORMAT コマンドは、記述を適用させたい LOGFILE コマンドよりも先に記述する必要があります。 ログファイルをコマンド行で指定するか、Mac の場合にはアプリケーションの上にドラッグするときには、DEFAULTLOGFORMATAPACHEDEFAULTLOGFORMAT を使う必要があります。 以下のように記述することで、複数のログファイルに対して、異なるフォーマットを適用することが可能です。

LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
上記の例では、log1 のフォーマットは format1 になり、log2log3format2 になります。 log0 にはどのフォーマットも適用されていませんので、 Analog はこのファイルのフォーマットを判別しようとします。
APACHELOGFORMAT コマンド には、Apache の httpd.conf ファイルに記述された LogFormat の内容を記述します。 例えば、httpd.conf に以下の行が含まれていた場合、
LogFormat "%h %l %u %t %v \"%r\" %>s %b" myformat
CustomLog /var/log/apache/access.log myformat
analog.cfg には、以下の行を含めます。
APACHELOGFORMAT (%h %l %u %t %v \"%r\" %>s %b)
LOGFILE /var/log/apache/access.log
( コマンドの引数に二重引用符(訳注「"」記号)が含まれているので、引数を囲むのに二重引用符ではなく括弧を使っています) Analog は、Apache の "%...{format}t" というカスタマイズの際に用いられる構造を解析できないという点を除き、すべての Apache のログのフォーマットを認識します。この構造を使っているときは、このコマンドではなく、従来の LOGFORMAT を使う必要があります。(その理由は、"%...{format}t" が時々ローカライズされているからです。)
LOGFORMAT コマンドに記述することができるフォーマットには、大きく二種類あります。一つはフォーマットを示すキーワードで、もう一つがログフォーマット文字列になります。 まずは、キーワードの方をみていきましょう。

すべてのキーワードは、Analog にあらかじめ組み込まれているフォーマットを示す文字列になります。ログファイルが標準的なフォーマットであるにも関わらず、ファイルの先頭行が不正になっていたり、北米の日付の形式か国際的な日付の形式かを Analog が識別できなかったりするなど、何らかの理由で Analog がフォーマットを認識できない場合には、これらのキーワードを使う必要があるかも知れません。例えば、

LOGFORMAT COMMON
のように記述することで、コモンログフォーマットを、同様にして、 COMBINEDREFERRERBROWSEREXTENDEDMICROSOFT-NA(北米の日付の書式)、 MICROSOFT-INT (国際的な日付の書式)、 WEBSITE-NAWEBSITE-INTMS-EXTENDED (Microsoft 版の拡張フォーマット)、 WEBSTAR-EXTENDED (WebSTAR 版の拡張フォーマット)、 MS-COMMON (Microsoft のソフトウェアの幾つかにみられる、誤ったコモンログフォーマット)、 NETSCAPEWEBSTARMACHTTPなどを指定できます。 これらのフォーマットについては、 前の章の末尾ですべて説明されています。また、特別なキーワードである AUTO を記述することで、自動認識に戻すことも可能です。

ログファイルが認識できるフォーマットのいずれでもなかった場合は、ログフォーマット文字列を使って Analog にフォーマットを認識させることができます。これが必要になるのは、ログファイルが標準的なフォーマットのいずれでもない場合にのみです。 (標準的なフォーマットでなかった場合でも、Apache の Web サーバを使っているのであれば、APACHELOGFORMAT を使った方がやさしいことに気づくことでしょう。)

ログフォーマット文字列には、ログファイル行の様々なフィールドや特殊文字に置換される、以下のような変数(template)が含まれています。これらの文字は大文字と小文字を区別するので注意してください。例えば %b%B は全く違うものになります!

%S
ホスト名 (リクエストを行なっているクライアントのホスト名、もしくはアドレス)
%s
クライアントのIPアドレス (別のフィールドとして記録されている場合に、%S が空の場合に使われる)
%r
リクエストされたファイル名
%q
クエリ文字列 (別のフィールドとして記録されている場合に、ファイル名のうち?の後の部分を示す)
%B
ブラウザ名
%A
スペースが+に置換されたブラウザ名
%f
参照元(Referrer)
%u
ユーザ名 (便宜上、クッキーの情報が%uとして認識される場合もある)
%v
仮想ホスト名 (サーバのホスト名、仮想ドメイン名と呼ばれることもある)
%d
月の中の日
%m
%M
3文字に短縮表記された月の英語名
%y
2桁の年
%Y
4桁の年
%Z
2桁もしくは4桁の年(あまり有用でない)
%h
1日の中の時刻
%n
1時間の中の分
%a
%hが12時間表記の場合に時刻の末尾に午前の場合はaまたはA、午後の場合はpまたはPをつける書式 (なお、「am」という表記にマッチさせたい場合は%am、「AM」という表記にマッチさせたい場合は%aMと記述する必要がある)
%U
「UNIX時間」(1970から標準時で計算された秒数) 小数を含む場合は、%U.%jの表記を用いること
%b
転送されたバイト数
%t
秒単位の処理時間
%T
ミリ秒単位の処理時間
%D
マイクロ秒 (10の -6 乗秒) 単位の処理時間
%c
HTTP のステータスコード
%C
サーバによってHTTPステータスコードの代わりに用いられているキーワード。内部的にのみ使用される
%j
無視: このフィールドを無視する (フィールド自体が存在しないかも知れない)
%w
1個以上のホワイトスペース: スペースもしくはタブ
%W
0個以上のホワイトスペース
%%
% 記号
\n
改行
\t
タブ
\\
バックスラッシュ文字1個
例えば、以下のようなコモンログフォーマットは、
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
"GET /~sret1/ HTTP/1.0" 200 1243
(except all on one line) LOGFORMAT コマンドを使うと以下のように表すことができます。
LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
これは、サンプルに過ぎませんが、ホスト名は %S に置き換えられる、ユーザ名は %u に置き換えられるといったことがわかります。 (引数にスペースが含まれるため、括弧が必要です) また、別の例として以下のような行があった場合
Fri 25/12/98 5:45pm, /~sret1/, jay.bird.com, 200, 1243,
http://www.site.com, Mozilla/2.0 (X11; I; HP-UX A.09.05)
(all on one line again)、以下のようなフォーマットで表すことができます。
LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B)
LOGFORMAT を記述する際に問題が発生した場合は、デバッグを有効にすることで、Analog に不正な行を出力させることが可能なことを覚えておくとよいでしょう。それでも問題が解決しない場合は、analog-help メーリングリストに書き込んでください (訳注: これは英語のメーリングリストです。日本では analog-jp メーリングリストをご利用ください)。
時には、一つのログファイルに異なるフォーマットの行が混在することもあります。 そういう時は、LOGFORMAT コマンドを並べて記述することで、以降のログファイルを両方のフォーマットで解析させることが可能です。これは、ログファイルのフォーマットが途中で変わってしまった時に役立ちます。 例えば、以下の設定は、
LOGFORMAT COMMON
LOGFORMAT COMBINED
LOGFILE log1
LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B)
LOGFILE log2
LOGFILE log3
log1 にコモンログと複合ログフォーマットの行が含まれており、log2 および log3 にはその前で記述されたフォーマットの行が含まれている場合の例になります。

幾つかのフォーマットを記述すると、Analog はログファイル内のすべての行について、まずは最初のフォーマットに合致するかどうかを確認し、失敗すると次のフォーマットに合致するかどうかを確認するという作業を行ないます。そのため、フォーマットを記述する順番が重要になります。フォーマットに合致するかどうかを無駄に確認する時間を節約する意味で、もっとも頻繁に現われるフォーマットを最初に記述した方がよいでしょう。


ある設定ファイル内あるいはコマンド行で、 ログファイルより前に LOGFORMAT コマンドが記述されていない時には、フォーマットが自動認識されると説明しましたが、実はこれは正しくありません。 実際のところ、そうしたログファイルには、デフォルトのフォーマットという特別なフォーマットが適用されます。 特に指定がない場合のデフォルトのフォーマットは自動認識ですが、DEFAULTLOGFORMAT コマンドを記述することでこれを変更することができます。 このコマンドは、LOGFORMAT と全く同じように機能しますので、全く同じフォーマットを認識しますし、DEFAULTLOGFORMAT コマンドを複数記述した場合も、前述したのと全く同じように機能します。違いは、このコマンドはどこに記述しても同じであるということでしょう。 (APACHEDEFAULTLOGFORMAT というコマンドもあります。これは Apache の LogFormat 文字列で記述するという点を除き、全く同じように機能をもっています。)

ここで、最初に挙げた例に戻りましょう:

LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
実際のところ、log0 にはデフォルトのログフォーマットが適用されています。DEFAULTLOGFORMAT コマンドが記述されていなかった場合のデフォルトは、自動認識です。ただし、他の設定ファイルであっても DEFAULTLOGFORMAT コマンドが記述されていれば、それが log0 に適用されます。

LOGFORMAT の代わりに DEFAULTLOGFORMAT を使った方がよいケースとしては、LOGFILE コマンドが適用されないログファイル、例えばコマンドラインで指定したものや、Mac でプログラムのアイコンにドラッグするもの、もしくはコンパイル時に指定したもの、などのフォーマットが変更になった場合でしょう。


LOGFORMAT コマンドの技術的な詳細と Tips

The "Unix time", %U は常に GMT で記録されます。 そのため、おそらくは地域の時刻に変換するために、LOGTIMEOFFSET コマンドを使うことが必要になります。 また、%Uに含まれるのは時刻の整数部だけですので、時刻に小数が含まれる場合は、%U.%jという組合せを使う必要があります。

Analog が認識できるログフォーマットは、instantaneously decipherable(即座に変数の展開が可能) なものだけです。これは、文字列中に文字列の終端を示す文字が含まれてはならないということを意味します。例えば、以下のようなコモンログフォーマットにおいて、

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
ホスト名にスペースが含まれていると、その行は不正なものとして扱われてしまいます。これは、Analog が最初に「 - 」が現われる箇所ではなく、最初に現われるスペースでホスト名が終ってしまうと認識してしまうため、行の残りの部分に不整合が発生してしまうためです(訳注: ちょっとぎこちない訳ですので流暢な翻訳を募集)。 aもちろん、ホスト名にスペースが含まれることはありませんので、この問題は発生しません。それ以外にも幾つかの制限事項があります。日付や時間の情報については、年、月、日、時、分のすべてが存在している必要があります。またフォーマット中に、同じものを示す情報が重複して現われてはいけません(例えば、%mと%Mは、両方とも月を示しますので、同時に存在してはなりません。こうした場合は、どちらかを%jに置き換えて、無視するようにしてください)。

時には、ログファイルのあるフィールドを読み込むだけで解析しないという処理が必要になります。例えば、コモンログと Referrer ログを別個に保持している場合が該当します。Referrer ログは以下のようになっています。

http://guide-p.infoseek.com/Titles -> /~sret1/analog/
ところが、/~sret1/analog/へのリクエストに関する情報は、すでにメインのログファイルを読み込んだ時点で取得されてしまっているので、ここで再度読み込みたくありません。こうした場合は、ログフォーマット文字列に以下のように*を指定することで、問題を解決することができます。
LOGFORMAT (%f -> %*r)

TIPS: 隣接する複数のフィールドを無視する際に、無視するフィールドが確実に識別できる場合は、一つの%jを用いて指定することで簡略化することができます。例えば、コモンログフォーマットは、以下のように指定するとより簡略化されます。

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j] "%j %r %j" %c %b)
[25/Dec/1998:17:45:35 +0000]という日付と時刻の表記において、%jを一つ記述することで、その範囲を「]」記号の前まで含めることが可能となりますので、秒と時間帯の両方を無視することができます。

TIPS: %j は、個別のフィールドだけでなく、行全体を無視するために使うこともできます。例えば、拡張ログフォーマットで、#から始まる行を無視するには、以下のように記述します。

LOGFORMAT #%j
また、Microsoft フォーマットで FTP 関連の行を無視するには、以下のように記述します。
LOGFORMAT (%*S, %*u, %m/%d/%y, %h:%n:%j, %j)
これらの記述を使わなかった場合、こうした行は不正な行として扱われます。
最後になりますが、リファレンスと記述例を兼ねて、以下に Analog が認識するすべてのフォーマットについて、前の章で掲載したサンプル行と対応する組み込みのフォーマット (適宜複数行に分割しています) を併せて記載します。
コモンログフォーマットLOGFORMAT COMMON
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
      "GET /~sret1/ HTTP/1.0" 200 1243
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%wHTTP%j" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b)
Microsoft のコモンログフォーマットLOGFORMAT MS-COMMON
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000]
      "GET /~sret1/ "HTTP/1.0" 200 1243
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%w"HTTP%j" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b)
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b)
複合ログフォーマットLOGFORMAT COMBINED
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0" 200
      1243 "http://www.site.com/" "Mozilla/2.0 (X11; I; HP-UX A.09.05)"
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r%wHTTP%j" %c %b "%f" "%B")
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%j%w%r" %c %b "%f" "%B")
LOGFORMAT (%S %j %u [%d/%M/%Y:%h:%n:%j] "%r" %c %b "%f" "%B")
Referrer ログフォーマットLOGFORMAT REFERRER
[25/Dec/1998:17:45:35] http://www.site.com/ -> /~sret1/
or http://www.site.com/ -> /~sret1/
LOGFORMAT ([%d/%M/%Y:%h:%n:%j] %f -> %*r)
LOGFORMAT (%f -> %*r)
ブラウザログフォーマットLOGFORMAT BROWSER
[25/Dec/1998:17:45:35] Mozilla/2.0 (X11; I; HP-UX A.09.05)
LOGFORMAT ([%d/%M/%Y:%h:%n:%j] %B)
Microsoft ログフォーマット(北米の日付の書式)LOGFORMAT MICROSOFT-NA
192.64.25.41, -, 12/25/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
192.64.25.41, -, 12/25/2001, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
LOGFORMAT (%S, %u, %m/%d/%Z, %h:%n:%j, W3SVC%j, %j, %v,
      %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %m/%d/%Z, %h:%n:%j, %j)
Microsoft ログフォーマット, 国際的な日付の書式LOGFORMAT MICROSOFT-INT
192.64.25.41, -, 25/12/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
192.64.25.41, -, 25/12/2001, 17:45:35, W3SVC1, HOST1, 192.16.225.10,
      2178, 303, 1243, 200, 0, GET, /~sret1/, -,
LOGFORMAT (%S, %u, %d/%m/%Z, %h:%n:%j, W3SVC%j, %j, %v,
      %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %d/%m/%Z, %h:%n:%j, %j)
WebSite ログフォーマット、北米の日付の書式, LOGFORMAT WEBSITE-NA
12/25/98 17:45:35  jay.bird.com  host1  Server  fred  GET  /~sret1/
   http://www.site.com/    Mozilla/2.0 (X11; I; HP-UX A.09.05)  200  1243  2178
LOGFORMAT (%m/%d/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T)
WebSite のログフォーマット, 国際的な日付の書式, LOGFORMAT WEBSITE-INT
25/12/98 17:45:35  jay.bird.com  host1  Server  fred  GET  /~sret1/
   http://www.site.com/    Mozilla/2.0 (X11; I; HP-UX A.09.05)  200  1243  2178
LOGFORMAT (%d/%m/%y %h:%n:%j\t%S\t%v\t%j\t%u\t%j\t%r\t%f\t%j\t%B\t%c\t%b\t%T)
MacHTTP のログフォーマットLOGFORMAT MACHTTP
12/25/98  17:45:35   OK    jay.bird.com  /~sret1/  1243
LOGFORMAT (%m/%d/%y\t%h:%n:%j \t%C%w%S\t%r\t%b)
拡張ログフォーマット、Netscape ログフォーマット、WebSTAR ログフォーマットについては、組み込みのフォーマットはありません。Analog はヘッダ行からフォーマットを生成します。
Analog ホームページ

Stephen Turner
23 August 2003

Analog についての質問はanalog-help メーリングリスト をお使いください。 (訳注: 日本では analog-jp メーリングリスト をご利用ください)

[ 先頭 | 上へ | 前へ | 次へ | 目次 | 索引 ]