Analog 5.91beta1: ログファイルのフォーマットログファイルのフォーマットを指定するための基本的なコマンドは、以下のようになります。
LOGFORMAT formatformat としてとり得る値については、この後すぐに説明します。Apache サーバを使っている場合は、このコマンドの代わりに以下のコマンドを使うと便利でしょう。
APACHELOGFORMAT apacheformat
LOGFORMAT と APACHELOGFORMAT コマンドは、同じ 設定ファイル内で、このコマンドよりも後に記述された LOGFILE コマンドで指定されるログファイルにのみ適用されます。 そのため、LOGFORMAT コマンドは、記述を適用させたい LOGFILE コマンドよりも先に記述する必要があります。 ログファイルをコマンド行で指定するか、Mac の場合にはアプリケーションの上にドラッグするときには、DEFAULTLOGFORMAT か APACHEDEFAULTLOGFORMAT を使う必要があります。 以下のように記述することで、複数のログファイルに対して、異なるフォーマットを適用することが可能です。
LOGFILE log0 LOGFORMAT format1 LOGFILE log1 LOGFORMAT format2 LOGFILE log2 LOGFILE log3上記の例では、log1 のフォーマットは format1 になり、log2 と log3 は format2 になります。 log0 にはどのフォーマットも適用されていませんので、 Analog はこのファイルのフォーマットを判別しようとします。
LogFormat "%h %l %u %t %v \"%r\" %>s %b" myformat CustomLog /var/log/apache/access.log myformatanalog.cfg には、以下の行を含めます。
APACHELOGFORMAT (%h %l %u %t %v \"%r\" %>s %b) LOGFILE /var/log/apache/access.log( コマンドの引数に二重引用符(訳注「"」記号)が含まれているので、引数を囲むのに二重引用符ではなく括弧を使っています) Analog は、Apache の "%...{format}t" というカスタマイズの際に用いられる構造を解析できないという点を除き、すべての Apache のログのフォーマットを認識します。この構造を使っているときは、このコマンドではなく、従来の LOGFORMAT を使う必要があります。(その理由は、"%...{format}t" が時々ローカライズされているからです。)
すべてのキーワードは、Analog にあらかじめ組み込まれているフォーマットを示す文字列になります。ログファイルが標準的なフォーマットであるにも関わらず、ファイルの先頭行が不正になっていたり、北米の日付の形式か国際的な日付の形式かを Analog が識別できなかったりするなど、何らかの理由で Analog がフォーマットを認識できない場合には、これらのキーワードを使う必要があるかも知れません。例えば、
LOGFORMAT COMMONのように記述することで、コモンログフォーマットを、同様にして、 COMBINED、 REFERRER、 BROWSER、 EXTENDED、 MICROSOFT-NA(北米の日付の書式)、 MICROSOFT-INT (国際的な日付の書式)、 WEBSITE-NA、 WEBSITE-INT、 MS-EXTENDED (Microsoft 版の拡張フォーマット)、 WEBSTAR-EXTENDED (WebSTAR 版の拡張フォーマット)、 MS-COMMON (Microsoft のソフトウェアの幾つかにみられる、誤ったコモンログフォーマット)、 NETSCAPE、 WEBSTAR、 MACHTTPなどを指定できます。 これらのフォーマットについては、 前の章の末尾ですべて説明されています。また、特別なキーワードである AUTO を記述することで、自動認識に戻すことも可能です。
ログファイルが認識できるフォーマットのいずれでもなかった場合は、ログフォーマット文字列を使って Analog にフォーマットを認識させることができます。これが必要になるのは、ログファイルが標準的なフォーマットのいずれでもない場合にのみです。 (標準的なフォーマットでなかった場合でも、Apache の Web サーバを使っているのであれば、APACHELOGFORMAT を使った方がやさしいことに気づくことでしょう。)
ログフォーマット文字列には、ログファイル行の様々なフィールドや特殊文字に置換される、以下のような変数(template)が含まれています。これらの文字は大文字と小文字を区別するので注意してください。例えば %b と %B は全く違うものになります!
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 COMMON LOGFORMAT COMBINED LOGFILE log1 LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B) LOGFILE log2 LOGFILE log3log1 にコモンログと複合ログフォーマットの行が含まれており、log2 および log3 にはその前で記述されたフォーマットの行が含まれている場合の例になります。
幾つかのフォーマットを記述すると、Analog はログファイル内のすべての行について、まずは最初のフォーマットに合致するかどうかを確認し、失敗すると次のフォーマットに合致するかどうかを確認するという作業を行ないます。そのため、フォーマットを記述する順番が重要になります。フォーマットに合致するかどうかを無駄に確認する時間を節約する意味で、もっとも頻繁に現われるフォーマットを最初に記述した方がよいでしょう。
ここで、最初に挙げた例に戻りましょう:
LOGFILE log0 LOGFORMAT format1 LOGFILE log1 LOGFORMAT format2 LOGFILE log2 LOGFILE log3実際のところ、log0 にはデフォルトのログフォーマットが適用されています。DEFAULTLOGFORMAT コマンドが記述されていなかった場合のデフォルトは、自動認識です。ただし、他の設定ファイルであっても DEFAULTLOGFORMAT コマンドが記述されていれば、それが log0 に適用されます。
LOGFORMAT の代わりに DEFAULTLOGFORMAT を使った方がよいケースとしては、LOGFILE コマンドが適用されないログファイル、例えばコマンドラインで指定したものや、Mac でプログラムのアイコンにドラッグするもの、もしくはコンパイル時に指定したもの、などのフォーマットが変更になった場合でしょう。
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)これらの記述を使わなかった場合、こうした行は不正な行として扱われます。
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)
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)
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")
[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)
[25/Dec/1998:17:45:35] Mozilla/2.0 (X11; I; HP-UX A.09.05) LOGFORMAT ([%d/%M/%Y:%h:%n:%j] %B)
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)
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)
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)
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)
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)
Stephen Turner
Analog についての質問はanalog-help メーリングリスト をお使いください。 (訳注: 日本では analog-jp メーリングリスト をご利用ください)