Analog 5.91beta1: ログファイルの選択LOGFILE logfilenameになります。あるいは、analog logfilename のように、他の引数なしにコマンドライン上でログファイル名を指定しても構いません。 Mac 版では、Analog アイコン上にログファイルをドラッグすることでも、そのログファイルの解析を行なわせることができます。 すべてのログファイルは、コンピュータ上のファイルシステム (ディスク上、もしくは UNIX におけるマウントされたファイルシステム上や Windows NT におけるドライブ名を割り当てられた共有ディスク上) にある必要があります。 FTP や HTTP を使って、ログファイルをインターネットから取得したりすることはできません。
- 記号もしくは stdin というキーワードは、標準出力を意味します。これは、 UNIX システムでパイプを使う際に便利です。 LOGFILE コマンドには、オプションで二番目の引数が存在します。これについては 以下で 説明します。
複数の LOGFILE コマンドを記述することが可能です。 ログファイル名の指定は、ワイルドカードで行なうことも可能ですし (ただしディレクトリ名部分については、この限りではありません。利用の可否はシステムに依存します) 、(スペースを入れずに) コンマで区切ったログファイルのリストで指定することも可能です。以下のコマンドは、Analog に logfile1 、 c:\logs\logfile2 、 .log で終わる全てのファイルを読み込ませる記述になります。
LOGFILE logfile1,*.log LOGFILE c:\logs\logfile2Mac を利用している場合は、以下のような指定も可能です。また
LOGFILE "Hard Drive:Internet Applications:Analog:Logs:*"また、以下の特別なコマンド
LOGFILE noneにより、これ以前に指定されたログファイルのリストを無効にすることも可能です。
LOGFILE コマンドで指定されたログファイル名にディレクトリ名が含まれていない場合、 Analog は、特定の場所 (この場所はコンパイル時のオプションです) にある設定ファイルを読み込もうとします。 例えば、 Windows 版の場合、これは Analog の実行ファイルと同じフォルダになります。ただし、コマンドラインで指定されたログファイル名について、これはカレントディレクトリになります。
以下の表記を利用することで、 LOGFILE 名に日付を含めることが可能です。
%D 日 %m 月の英語名 %M 月 %y 2桁の年 %Y 4桁の年 %H 時間 %n 分 %w 曜日の英語名例えば、以下の例
LOGFILE access_log%Y%M.logでは、2001 年 9 月の場合、 access_log200109.log という名前のログファイルを読み込もうとします。 この日付は、 TO が指定されていた場合はその日付を示し、それ以外の場合はプログラムが起動した日付を示します。 以下の例は、直近の月のすべてのログファイルを指定するコマンドになります
TO -00-0131 # 直近の次の末日まで LOGFILE access_log%Y%M??.log # 2001 年 9 月の場合は、access_log200108??.log を読み込む
LOGFILE コマンドの指定は、基本的に累積されていきます。ただし、コマンドラインで直接、あるいはコマンドラインで指定された設定ファイル中で指定されたログファイルは、 デフォルト設定ファイル、もしくはそのファイル内で読み込まれた設定ファイルで指定されたコマンドの記述を上書きします。また、それらの設定は、強制設定ファイル、もしくはそのファイル内で読み込まれた設定ファイルで指定されたコマンドの記述によって上書きされます。 通常この仕様に悩む必要はないでしょう。一般的に期待されるような動きをしていると思います (厳密には、「ログファイルまたはキャッシュファイル」と言わないといけないところですが、これについては 後述します)。
ログファイルが、標準的なフォーマットでない場合でも、LOGFORMAT コマンドを用いてその他のフォーマットを指定することができますので、通常は大丈夫でしょう。 これについては、 次の章 で説明があります。もっとも、ほとんどのユーザは、標準的なフォーマットのログファイルを扱うと思いますので、この点について知る必要はないでしょう。 そのため、とにかくログファイルを Analog に解析させてみて、Analog が認識するかどうかを確かめてみるのが近道です。Analog が認識できたのであれば、LOGFORMAT に気を掛ける必要はありません。
Analog がログファイルを認識できない場合は、「フォーマットを認識できない」、もしくは「不正な行が多数検出された」といった警告が出力されます。こうしたことが発生する理由としては、基本的に以下の五つが考えられます:
LOGFILE mydomain.log http://www.mydomain.comは、 mydomain.log 中の /file.html というファイル名を http://www.mydomain.com/file.html に変換します。 (もし1個のサーバからのログファイルしか無く、かつ異なるサーバ上で出力を表示したい場合には、上記のコマンドの代わりに BASEURL コマンドを使えばよいでしょう。)
これにより、ファイル名が変換されますので、 FILEINCLUDE、 FILEEXCLUDE、 FILEALIAS といったコマンドは、変換後の名前で指定する必要があります。
このコマンドにより、幾つかの仮想ホストからのログファイルをまとめた場合、「仮想ホストレポート」では仮想ホストについての情報が出力されなくなります。これは、仮想ホスト名がファイル名の一部になってしまうためです。この場合、代わりに「ディレクトリレポート」を参照してください。(おそらく、 SUBDIR コマンドも利用した方がよいでしょう。)
ログファイルの各行に仮想ホスト名が含まれている場合は、引数に %v を含めることで、仮想ホスト名を挿入することが可能になります。%v が含まれているにもかかわらず、ログファイルに仮想ホストの情報が含まれていない場合、その行は不正な行とみなされます。
このコマンドでは、展開する必要があるファイル形式について、コンマ区切りのリストの形で記述した上で、対応するコマンドとして、標準出力 (ファイルではなく) にファイルを展開するコマンド名を指定することが必要です。 例えば、UNIX であれば、以下のようになるでしょう。
UNCOMPRESS *.Z "/usr/bin/uncompress -c"一方、Windows NT では、以下のようになるでしょう。
UNCOMPRESS *.Z ("c:\Program Files\uncompress\uncompress" -c)
Analog が、あるログファイルを展開中にこれは解析対象ではないと判断した場合、「broken pipe」エラーが発生します。これは、展開を行なっているコマンドが出力しますので、Analog の制御範囲外の事象になりますが、いずれにしても無害です。
(DNS の参照など、これ以外の処理で UNCOMPRESS コマンドを中断するような処理はありません。)
コモンログフォーマットは、ほとんどのサーバによって利用されています。ログファイルの行は以下のようになります
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0" 200 1243(実際には上記は 1 行です)。 Microsoft 社のソフトウェアのバージョンによっては、この処理にバグがあり、以下のように、余分な記号が HTTP の前についてしまいます:
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ "HTTP/1.0" 200 1243Analog はこれを認識しますが、(複数のフォーマットが混在する場合のように) フォーマットが途中で変更された場合は、その行を排除してしまいます。
[25/Dec/1998:17:45:35] http://www.site.com/ -> /~sret1/また、ブラウザ(エージェント)ログは、以下のようになります。
[25/Dec/1998:17:45:35] Mozilla/2.0 (X11; I; HP-UX A.09.05)Referrer ログの日付は省略することが可能です。
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)"(実際には上記は 1 行です)。Apache サーバを使っている場合、mod_log_config モジュールを有効にすることで、以下の Apache のコマンドによりこのフォーマットを生成することができます。
LogFormat "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\""
少ないスペースで多くの情報を格納することができるため、ログを別々に分割するよりも、複合ログを使う方が通常はよいでしょう。
192.64.25.41, -, 25/12/98, 17:45:35, W3SVC1, HOST1, 192.16.225.10, 2178, 303, 1243, 200, 0, GET, /~sret1/, -,(実際には上記は 1 行です。また場合によっては年が4桁になっています)。 しかしながら、このフォーマットは日付が各地域の表記で記録されてしまうという点で、非常に問題がある設計だと言わざるをえません。例えば北米では、上記の例の日付部分は、12/25/98 という表記になります。Analog は可能な限りどの書式かを判別しようとしますが、日も月もすべて 12 以下だった場合には、書式を判断することが不可能です。この場合、Analog は、北米の日付の書式については LOGFORMAT MICROSOFT-NA というコマンドを、国際的な日付の書式については、LOGFORMAT MICROSOFT-INT というコマンドを使うようにというメッセージを出力します。 日付の表記が、いずれの書式にも該当しない国については、 次の章にあるサンプルに基づいて、独自の LOGFORMAT コマンドを記述する必要があります。
また、このフォーマットには、ブラウザや Referrer を含めるためなどの目的で、多くのサードパーティによる拡張も存在します。しかし、これらは独自の拡張であるため、 Analog は自動で判断することができず、この場合についても、フォーマットに対応した LOGFORMAT コマンドを記述することが必要になります。
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(実際には上記は 1 行です。また各フィールドはタブで区切られています)。 これには、IIS のログファイル(前述)と同様に、日付が不明確になってしまう問題があります。そのため、LOGFORMAT WEBSITE-NA や LOGFORMAT WEBSITE-INT といったコマンドや、独自の LOGFORMAT コマンドを使うことが必要になる場合があります。
12/25/98 17:45:35 OK jay.bird.com /~sret1/ 1243フィールドはタブで区切られています。
Analog がヘッダの行が不正であると認識した場合、通常は問題が何かを出力します。よくある問題は、日付なしの時刻や、時刻なしの日付を使うことができないというものです。ログファイルの先頭に日付があるだけでは不十分で、各行にその情報が必要です。Microsoft 社のサーバは、デフォルトで、先頭だけに日付が入った拡張ログを生成します。途中で日付が変更になっても、サーバは新しい日付の行を挿入しません。このため、エントリに日付が入っていなかったり、不正になっていたりすると、Analog は情報を補うことや、場合によっては状況を認識することすらもできず、結果としてどちらの場合も処理をすることができません。
このため、Analog は、こうしたログファイルを安全に解析することができないことを認識して、むりやり解析をおこなう代わりに、日付を各行につけるように警告を出します。helper applications のページ には、各行に日付を付加してくれるようなプログラムがいくつかあります。 日付が記載されていないログファイルが手元にある場合は、こうしたプログラムを使って日付の情報を追加することもできますが、こうしたプログラムは、ログファイルの日付が途中で変わるようなことを想定していませんので、将来的には、サーバが各行に日付の入ったログを出力するようにすることを強く勧めます。
拡張形式のログについては、 http://www.w3.org/TR/WD-logfile.htmlで説明されています。 先頭の行は、以下のようになっています。
#Fields: date time cs-uriログファイルの残りの部分については、タブやスペースでフィールドが区切られています。 ログファイルは、全ての行に日付と時刻の両方を含むことが必須であることを、忘れないでください。詳細は、上記を参照してください。
拡張形式のフォーマットについては、Microsoft の行なった実装があります。残念ながら、彼らは仕様書をよく読んでおりませんでした。そのため、ブラウザ名や Referrer の情報は引用符で囲まれておらず、ブラウザ名中のスペースが + に置き換えられており、さらにリクエストの時間も秒単位でなくミリ秒単位で記録されてしまっています。 これについては、WebSTAR のおこなった実装もあります。これは基本的に正しい実装なのですが、CS-HOST フィールドにサーバのホスト名でなくクライアントのホスト名を入れてしまうという誤用があります。Analog はこれを認識します。
拡張ログでは、時刻が常に GMT で記録されていますので、地域時間に変換するために、 LOGTIMEOFFSET コマンドを使うことが必要になるでしょう。
WebSTAR フォーマットについては、http://www.starnine.com/webstar/docs/ws4manual.3f.htmlで説明されています。 ヘッダの行は、以下のようになっています。
!!LOG_FORMAT DATE TIME RESULT URL BYTES_SENT HOSTNAMEログファイルの残りの部分については、タブでフィールドが区切られています。WebSTAR サーバでも、時刻は常に GMT で記録されていますので、地域時間に変換するために、 LOGTIMEOFFSET コマンドを使うことが必要になるでしょう。 これ以外のいくつかの Mac 用サーバも、WebSTAR フォーマットやそれに類似したフォーマットを使用しています。Analog はこれらについても認識します。
最後になりますが、Netscapeのヘッダ行は、以下のようになっています。
format=%Ses->client.ip% [%SYSDATE%] "%Req->reqpb.clf-request%" %Req->srvhdrs.clf-status% %Req->srvhdrs.content-length%
Stephen Turner
Analog についての質問はanalog-help メーリングリスト をお使いください。 (訳注: 日本では analog-jp メーリングリスト をご利用ください)