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

Analog 5.91beta1: エイリアス(置換)


各ログファイルのエントリを読み込むと、Analog は各項目に対してエイリアスを適用します。 まず、大文字と小文字を区別しないファイルシステムの場合、Analog はファイル名を小文字に変換します。通常、Analog は、UNIX と BeOS のファイルシステムは大文字と小文字を区別し、それ以外の OS のファイルシステムは大文字と小文字を区別しないものとみなします。ファイルを別のマシンへ転送した際に、元のマシンの OS として判断させたい場合などに、この判別を変更したい場合もあると思います。以下のコマンドでこの変更を行なうことができます。
CASE INSENSITIVE     (訳注:大文字小文字を区別しない)
CASE SENSITIVE       (訳注:大文字小文字を区別する)
ログファイルにユーザ名が記録されている場合のために、ユーザ名についても同じようなコマンドがあります。デフォルトでユーザ名は常に大文字と小文字を区別しないものとして扱われますが、以下のコマンドを記述することで、この設定を変更できます。
USERCASE SENSITIVE

次に Analog は組み込みのエイリアスを各項目に対して適用します。例えば Analog は、ファイル名中の %7E~ と同じものであると認識して、適切に変換を行ないます。またディレクトリのサフィックスがついたファイル名からは、それを取り除きます。通常このサフィックスは index.html ですが、以下のコマンドを使って、別のものを指定することもできます。
DIRSUFFIX default.htm
(DIRSUFFIX に記述できるものは1つだけです) これ以外にも組み込みのエイリアスがあります。例えば、この時点でホスト名は小文字に変換されます。
これらの操作が行なわれた後で、ユーザが記述したエイリアスが各項目に対して適用されます。 こうしたエイリアスは、複数のファイル名の実体が同一ファイルである場合や、内部のホスト名をインターネット側から参照される名前に変換したい場合などに便利です。 エイリアスは、以下のようなコマンドを使って記述できます。
FILEALIAS /football.html /soccer.html
HOSTALIAS lion lion.statslab.cam.ac.uk
FILEALIAS none という特別なコマンドを記述することで、明示的に記述されたもの以外のファイルに対するエイリアスを無効にすることができます。

それ以外の項目に対するエイリアスのコマンドとしては、BROWALIASREFALIASUSERALIASVHOSTALIASがあります。 ある項目に対して、複数のエイリアスが適用されることはありません。

FILEALIAS /football.html /soccer.html
FILEALIAS /soccer.html /brazil.html
上記の場合、/soccer.html というファイルは /brazil.html に変換されますが、/football.html/soccer.html に変換されるだけで、もう一つのエイリアスは参照されません。

ALIAS コマンドではワイルドカードを使うこともできます: ? は任意の1文字にマッチし、* は任意の個数の文字にマッチします (0個の場合もあります)。 右側の引数では、 * にマッチした左側の引数の部分部分を示す表記として、$1$2 といった記述もできます。また、特別なものとして、左側の引数に * がただ1つだけ存在する場合、右側の引数では、$1 と同じ意味として * を使うことができます。 例えば、以下の例では

FILEALIAS /*/football/* /soccer/
/sport/football/rules.html/soccer/ に変換されますが、以下の例では
FILEALIAS /*/football/* /$1/soccer/$2         # もしくは
FILEALIAS /sport/football/* /sport/soccer/*
いずれの場合も /sport/football/rules.html/sport/soccer/rules.html に変換されます。

右側の引数で $ 自身を記述したい時には、 $$ と記述します。 また、右側の引数の先頭に「PLAIN:」をつけることで、右側の引数にある $*をそのままの文字として扱うことができます。 例えば、以下の例では

FILEALIAS /*/football/* PLAIN:/$1/soccer/$2
/sport/football/rules.html/$1/soccer/$2 そのものに変換されます。

Analog の * は、貪欲(greedy)ではありません。複数のマッチングが考えられる場合は、範囲が最低限になるようなマッチングを行ないます。この方が意図した結果が得られることが多いでしょう。しかし、これは Perl の正規表現とは相反します。(なお、*を2つ並べて記述しても全く意味がありません。このように記述しても、$1$2といったエイリアスの適用を行なう前に、1つの*にまとめられてしまいます)

ファイルにsearch argumentsが含まれている場合、FILEALIASREFALIAS は、やや直観的ではない動きをすることがあります。

UNIX 上のユーザに対する注意: ALIAS コマンドをコマンドライン上で +C オプションで指定した場合、シェルが $1 を展開してしまいますので、意図した結果が得られません。このシェルの動作を抑止するには、コマンドをダブルクオートではなく、シングルクオートで囲んでください。


これまでのものとは別に、出力エイリアスと呼ばれるエイリアスコマンド群も存在します。 これは、各項目に対するエイリアスではなく、レポートの各行に対するエイリアスになります (出力エイリアスは、ログファイル中の複数の行に同じものがあったとしても、それらをまとめるということは決して行ないません) 。 例えば、以下のコマンド
TYPEALIAS .txt ".txt (Plain text files)"
は、ファイル種類別レポート中の行に対する説明文を提供します。

通常のエイリアスコマンドと出力エイリアスコマンドの違いがわかりにくいこともあります。例えば、FILEALIASREQALIASの違いはどこにあるのでしょうか? 実際のところ、両者の機能には多少の差異があります。FILEALIASファイル名そのものに対して適用されますが、REQALIASは、リクエストレポート内の行に対してのみ適用されます。つまり、REQALIASがリクエストレポートにしか影響しないのに対し、FILEALIASは、ディレクトリレポートなど、ファイル名に関連する別のレポートにも影響するわけです。

もう一つの違いは、REQALIASがリクエストレポートの行ごとに適用されるという点でしょう。つまり、FILEALIASによって、複数のファイル名が同じファイル名に変換されると、それらのファイルはすべてのレポートにおいて一つのファイルとして扱われますが、REQALIASコマンドの場合、それらのファイルは依然として二つのファイルのままとして扱われ、リクエストレポート中でも同じ名前の行が複数現われることになるというわけです。

結局、どのコマンドをどういう場合に使うべきでしょうか? は1つのファイルが複数の名前を持っていて、Web サーバが同じファイルに対して複数の URL を返却するような場合に使われます。一方、REQALIASは、通常リクエストレポートに注釈をつけたり、整形したりするために使われます。 両方を併用するのが便利な場合もあります。最初にFILEALIASを使って幾つかのファイル名を統合し、ついでREQALIASにより、リクエストレポート中でそれらに注釈をつけるといった場合です。

すべての出力エイリアスコマンドを以下に示します: REQALIAS, REDIRALIAS, FAILALIASTYPEALIASDIRALIASHOSTREPALIASREDIRHOSTALIASFAILHOSTALIASDOMALIASORGALIASREFREPALIASREFSITEALIASREDIRREFALIASFAILREFALIASBROWREPALIASBROWSUMALIASOSALIASVHOSTREPALIASREDIRVHOSTREPALIASFAILVHOSTREPALIASUSERREPALIASREDIRUSERALIASFAILUSERALIAS

なお出力エイリアスに関しては、エイリアス適用前にソートが行なわれてしまうという既知のバグが1つあります。このため、レポートに対する SORTBY コマンドが ALPHABETICAL に記述されていた場合、そのレポートは正しくソートされません。


ALIAS コマンドでは、正規表現を使うこともできます。 残念ながら、正規表現について知らない方に、いまここで使い方を教えるつもりはありません。UNIX を使っているのであれば、perlre、man regexman grepなどと入力してください。正規表現には、様々な実装が存在します。Analog が使っているのは、Perl 形式の正規表現です。基本的に、この正規表現は UNIX の egrep や GNU grep -E で使われている拡張正規表現のスーパーセットになります。

ALIAS コマンドの左側の引数の先頭に「REGEXP:」をつけることで、コマンドの引数に正規表現を使うことが可能になります。 また、「REGEXPI:」を使うことで、Perl の m//i や UNIX のegrep -i のような大文字と小文字を区別しないマッチングを指定することができます (ホスト名や、CASE INSENSITIVE を指定した際のファイル名など、多くの項目では自動的に大文字と小文字を区別しないマッチングが行なわれます) 。

ALIASコマンドの右側の引数では、 左側の引数の1つめや2つめのワイルドカードにマッチした対象を示す、$1$2といった記述もできます。 (もう一度書いておきますが、シングルクォートで囲まない限り、コマンドラインに$1$2などを記述することはできません)

正規表現は、文字列の一部にマッチ(一致)するとマッチしたことになります。文字列全体に一致させたいときには、正規表現文字列の両側を ^$ で囲む必要があります。

例えば、

REQALIAS REGEXP:^(/~(.+?)/.*) "[$2] $1"
は、リクエストレポート中の
/~sret1/backgammon/rules.html
[sret1] /~sret1/backgammon/rules.html
に変換します。 また、
HOSTALIAS REGEXP:^([^.]*)$ $1.mycompany.com
は、ドット(ピリオド)を含まないホスト名に、.mycompany.com を付け加えます (これがよい考えかどうかについては、FAQ での議論を参照してください)。

正規表現は貪欲です。複数のマッチングが考えられる場合は、範囲が最大限になるようなマッチングを行ないます。


Analog ホームページ

Stephen Turner
23 August 2003

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

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