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

Readme for analog3.90beta2

ログの書式設定

この章では、analog に対するログファイルの書式の伝え方について述べます。ここでは、前章 を読んだことを、また analog が何らかの理由であなたのログファイルの書式を検知出来なかったため、あからさまにログの書式を指定する必要があると仮定します。

ログの書式設定のための基本的なコマンドは以下の様になります。

LOGFORMAT format
-- 直ぐに、format が何であるかを述べます。LOGFORMAT コマンドは、同じ環境設定ファイル内の後のほうに位置した LOGFILE コマンドで指定された、ログファイルのみに適用されます。従って、LOGFORMAT を、参照すべき LOGFILE の上に書かなければなりません。このようにして、異なるログファイルは、異なる書式を持つことができます。例として、以下を挙げます。
LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
この例では、log1format1 であり、log2log3format2 であり、そして log0 はどの書式にも属していない。 -- analog は、このログファイルがどの書式なのかを見つけようとする。
もしあなたが Apache のウェブサーバ を使用しているなら、 単純な LOGFORMAT の代わりに APACHELOGFORMAT を使うことができる。この後に、Apache の httpd.conf に書かれている ログ書式 を書かなければならない。例えば、共通書式は以下の様に表される。
APACHELOGFORMAT (%h %l %u %t \"%r\" %s %b)
(括弧は、引数にスペースが含まれるので必要である。) analog は、Apache の "%...{format}t" という構造を解析できないという例外を除いて、Apache のログ書式を理解してくれる。もしこの構造があったときには、通常の LOGFORMAT を代わりに使用しなければならない。
LOGFORMAT コマンドを用いた可能な書式は、2種類ある。最初に幾つかの象徴的な単語があり、ログ書式の文字列 が続く。まずは、単語を見ていこう。

analog が承知している全ての組み込み書式に対する書式用の単語がある。もしログファイルが標準書式の時には、これらのうちのひとつの単語が必要かもしれないが、analog は、何らかの理由でどの書式であるのかは検知できない;例えば、多分最初の行が壊れてしまっている;あるいは、多分 analog が北米時間か国際時間を使用しているのかどうかを判断できない。従って例えば、

LOGFORMAT COMMON
は、共通書式を選択する;また、以下のオプションがある;COMBINEDREFERRER, BROWSER, EXTENDEDMICROSOFT-NA (北米時刻書式)、 MICROSOFT-INT (国際時刻書式)、 WEBSITE-NAWEBSITE-INTMS-EXTENDED (マイクロソフトの拡張書式)、 MS-COMMON (幾つかのマイクロソフト版のバグの多い共通書式)、NETSCAPE または WEBSTAR。これら全ての書式は、前章の終わり に定義されている。自動判別のための特別な単語 AUTO を使うこともできる。

もしあなたのログファイルが、認識可能な書式でない時には、ログ書式の文字列を用いて、analog に教えることができる。ログファイルが標準書式の一つでないときに限り、これが必要である。そしてたとえ標準書式でなくとも、もし Apache のウェブサーバを使っているなら、上記で述べた APACHELOGFORMAT の方がやさしいことが分かるであろう。

書式用の文字列は、以下の様に種々の項目や特殊文字をコードで置き換えた、ログファイルの各行に対するテンプレートからなっている。これらのコードは大小文字を区別するので注意が必要である。 -- 例えば、%b%B とは全く異なる!

%S
ホスト名 (リクエストをしているコンピュータ)
%r
リクエストされたファイル名
%B
ブラウザ名
%A
スペースの代わりに + が入ったブラウザ名
%f
参照元 (ファイルを参照している URL)
%u
ユーザ名 (一言:クッキーも %u と有効に 定義することができる)
%v
仮想ホスト名 (仮想ドメイン名とも呼ばれる)
%d
1月の日にち
%m
10進数の月名
%M
3文字の英語の省略月名
%y
最後の2桁表示の年度
%Y
4桁表示の年度
%h
1日の時刻
%n
1時間内の分
%a
もし %h が12時間時計なら、am (午前)に対して aA、または pm (午後)に対して pP、(従って、"am" とするなら、%am とし、 "AM" とするなら、%aM とする必要がある)
%U
"Unix 時間" (GMT 時間の1970年から計算した秒数)
%b
バイト単位のデータ転送量
%t
秒単位の処理時間
%T
ミリ秒単位の処理時間
%c
HTTP の状態コード
%C
特殊なサーバに特徴的な特殊コード
%q
検索文字列 (もし分離された場所に記録されているなら、 ? の後ろのファイル名の一部分)
%j
ガラクタ:この項目は無視せよ(項目自体も何も無いかもしれない)
%w
空白:スペースかタブ
%W
随意のスペース
%%
% 記号
\n
新しい行
\t
タブ
\\
1個のバックスラッシュ
従って例えば、以下の共通のログ書式、
jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0" 200 1243
は、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)
以下の書式が使える。
LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B)

ログファイルは、時々幾つかの異なる書式を含むことがある。そのため、幾つかの 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 は、共通と組み合わせ書式の両方を持つが、log2log3 は、一つ前の例の書式の行のみを持つ。

もし幾つかの書式が指定された場合、analog はまずは最初の書式に各行が一致するかどうかを試し、もし失敗した時には次を試し、等々と行う。そのため、書式の順番は大事である。通常は、不適切な書式と行が一致するかどうかを試すのに割く時間を最小にするために、最も一般的なものを最初に置く。


私は、上記で同じ環境設定フィル中の始めのほうで、 LOGFORMAT コマンドを持たないどのログファイルも自動的に認識されると、示唆した。しかしこれは必ずしも正しくない。実際、その様なログファイルは、初期設定ログ書式 と呼ばれる特別の書式を得る。初期設定書式は自動的に認識されて始まるが、もし望むなら DEFAULTLOGFORMAT コマンドを用いて変えることができる。このコマンドは、LOGFORMAT とまるっきり同じように働く。 -- これは、同じ書式を理解するし、もし幾つかの DEFAULTLOGFORMAT コマンドがある場合には、同じように順番に処理する。違いは、ある特別な場所に置く必要が無いことである。( APACHELOGFORMAT に似た、APACHEDEFAULTLOGFORMAT もある。)

それでは、最初の例に戻ろう。

LOGFILE log0
LOGFORMAT format1
LOGFILE log1
LOGFORMAT format2
LOGFILE log2
LOGFILE log3
ここでは、log0 は実際には初期設定のログ書式を取り。もし、DEFAULTLOGFORMAT コマンドが無ければ、初期設定は自動的に認識されるであろう。しかし、もし DEFAULTLOGFORMAT コマンドが別の環境設定ファイルにでもあれば、それが log0 の書式となるでしょう。

LOGFORMAT の代わりに DEFAULTLOGFORMAT を使う必要があるときは、LOGFILE コマンドで与えることができないログファイルの書式、これを変えたい時でしょう。 -- 例えば、コマンドラインで指定したもの、または Mac で analog のアイコンの上にドラッグしたもの、またはコンパイルした時に指定したもの。もしログファイルが常に同じ書式であれば、DEFAULTLOGFORMAT を使えば良い。そうすれば、充分な数の LOGFORMAT を適切な位置に置くことに頭を悩まさずに済む。


LOGFORMAT コマンドに関する幾つかの技術的な詳細とテクニック

"Unix 時刻", %U は、常に GMT (グリニッジ標準時間)で記録される。そのため、おそらく LOGTIMEOFFSET コマンドを使って、地域時刻に変換する必要があるだろう。また、時間の整数部分だけであるので、少数がある場合には、%U.%j の形を使わなければならないだろう。

analog が取り扱えるログの書式は、即解読可能 として知られているものだけである:実際のところ、これは、文字列を終わらせる文字が文字列中に現れないという事を意味する。従って例えば、共通書式では、以下の様に見える。

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b)
もしホスト名がスペースを含んでいたとしたら、その行は、以上行とされるでしょう。何故なら、analog は、スペース=ダッシュ=スペースが最初に起きる場所では なく、最初のスペースの所でホスト名を終わらせてしまい、残りの行は、一致するかどうかを見ないでしょう。もちろん、ホスト名はスペースを含むはずは無いので、これは問題とはならない。他にも幾つかの制限がある。もし、何らかの日にちか時刻の情報があった場合、年度、月、日にち、時間、分は全てなくてはならない。そして、同じ情報は、2度と書式には現れない (従って例えば、%m%M の両方は、指定できない。何故なら、これらは両方とも、月を表すからであり、もう片方を無視するために %j をすべきである )。

時には、ログファイルのある項目を読む必要があるが、解析する必要が無い場合がある。例えば、別々の共通ログと参照ログがあり、参照ログが以下の様になっているとする。

http://guide-p.infoseek.com/Titles -> /~sret1/analog/
しかし、/~sret1/analog/ へのリクエストは、主たるログファイルを読み込んだ時に既に勘定されてしまっているため、このときにもう一度勘定に入れたくない。書式の文字列に、以下の様に * を指定することによりこれを避けることができる。
LOGFORMAT (%f -> %*r)

助言:ログファイルの一行全体が認識可能な文字で終わる限り、2個かそれ以上の隣接している場を無視するために、一個の %j をもって指定すると、時々より効率的になる。従って、共通書式は、以下の様に指定するとより効率的になる。

LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j] "%j %r %j" %c %b)
-- 日にちと時刻に於いて [25/Dec/1998:17:45:35 +0000] 、秒と時間帯は、一つの %j で閉じ角括弧のところまで無視される。

もう一つの助言:%j は、analog が使用しない場ではなく、行全体を無視するために使うこともできる。例えば、拡張ログ書式は、# で始まる行を以下の様に書けば無視する。

LOGFORMAT #%j
そして、マイクロソフトの書式は、以下の様にすれば 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 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 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 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)
マイクロソフトのログ、北米日付, 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/, -,
LOGFORMAT (%S, %u, %m/%d/%y, %h:%n:%j, W3SVC%j, %j, %v, %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %m/%d/%y, %h:%n:%j, %j)
マイクロソフトのログ、国際日付, 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/, -,
LOGFORMAT (%S, %u, %d/%m/%y, %h:%n:%j, W3SVC%j, %j, %v, %T, %j, %b, %c, %j, %j, %r, %q,)
LOGFORMAT (%*S, %*u, %d/%m/%y, %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)
Netscape のログと WebSTAR のログのような拡張ログは、組み込み書式は無い。analog は、それらの先頭行からそれらの書式を構築する。
Stephen Turner
analog についての質問は analog-help の メーリングリスト を読んでください。

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