analog/6.0/doc/analog/analog のカスタマイズ ログフォーマットの指定 †このセクションでは analog に対してどのようにログ形式を認識させるかについて述べます。analog は自動的にログ形式を検出できるため、たいていの場合はここを読む必用はありません -- まずは自分自身でどんな問題が発生しているかを知るため、とりあえず設定を保存して analog を実行してみてください。変わった形式のログを使っているのでしたら、どうか以下の説明をお読み下さい。 ログ形式を定義する基本的なコマンドは次のようなものです。 LOGFORMAT ログ形式(format)
APACHELOGFORMAT apacheformat LOGFORMAT と APACHELOGFORMAT コマンドでログの形式を指定しているのは、同じログファイル中で続く行の LOGFILE に対して形式を指定しているものです。つまり、LOGFORMAT は LOGFILE の上に記述しなくてはいけません。もしコマンドライン上で実行する必用がある場合や Mac 版を使ってログをドラッグする場合は DEFAULTLOGFORMAT か APACHEDEFAULTLOGFORMAT で代用してください。この機能は異なったログファイル群に対して、それぞれ異なったログ形式を認識できるようにしているものです。例えば、次のような指定ができます。 LOGFILE log0 LOGFORMAT ログ形式1 LOGFILE log1 LOGFORMAT ログ形式2 LOGFILE log2 LOGFILE log3 上記の例では、log1 は"ログ形式1"、log2 と log3 は"ログ形式2"、そして log0 については他のログ形式 -- analog が自動でログ形式を識別しようとします。 APACHELOGFORMAT コマンドでは以下のように Apache の設定ファイル httpd.conf で指定しているようなものです。例えば、自分の使っている 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" のようにカスタマイズをしている場合は解析できません。このような場合には、オリジナルの LOGFORMAT を記述する必用があります("%...{format}t" という記述は時々見受けられます)。 LOGFORMAT コマンドで利用できるものには2種類あります。1つはログ形式を特定する文字列を記述する方法です。ほとんどの場合は単語です。 ログ形式には analog が識別可能な文字列を指定します。ログファイルが標準的なログ形式であれば、ログ形式名を記述してください。ですが、場合によっては analog がログを正しく認識出来ない場合もあります。例えば1行目が壊れているか、北米式の日時表記もしくは国際標準時を使っている事を analog で設定していない場合です。記述例は以下の通りです。 LOGFORMAT COMMON これは COMMON 形式のログだと明示しています。ログ形式には COMBINED・REFERRER・BROWSER・EXTENDED・MICROSOFT-NA (北米式の日時表記)・MICROSOFT-INT (国際標準時での表記)・WEBSITE-NA・WEBSITE-INT・MS-EXTENDED (マイクロソフト社の拡張ログ形式)・WEBSTAR-EXTENDED (WebSTAR社の拡張ログ形式)・MS-COMMON (マイクロソフト社が初期に用いたログの拡張形式)・NETSCAPE・WEBSTAR・MACHTTP が指定可能です。これらのログ形式の相違については前のセクション(>#formats)で述べました。他に特殊な指定方法として AUTO という自動認識モードがあります。 analog が識別できない形式のログファイルを使っている場合、analog に対してログ中の文字列がどのような書式で記述されているか伝える必用があります。ただし、ログとして認識できるのは、一行中にログ情報が書き込まれている一般的な形式でなくてはいけません(もし標準的な書式でなくても Apache サーバを使っている場合に限り、先に述べた APACHELOGFORMAT?(>#apache)) を用いることが出来ます。 ログファイルの各行については、テンプレートとなる文字列を明示することで書式が構成されます。それぞれ、以下に示す特殊な文字列で変数を表します。必ず注意して欲しいのは小文字と大文字は全く意味が違ってきます。たとえば %b と %B では全く内容が異なるので気をつけてください。 %S ホスト(サーバに対してリクエストしてきたクライアントのホスト名か IP アドレス) %s クライアントの IP アドレス($S が空白の場合でも別個の項目として扱います) %r リクエストされたファイル名 %q クエリー文字列(ファイル名の ? マークの後の部分です。独立した項目として扱います) %B ブラウザ名 %A ブラウザ名に空白スペースを含む場合 %f 参照元(referrer %u ユーザ名(TIP : クッキーやセッション ID も %u として用いると便利です) %v バーチャルホスト名(あるいはバーチャルドメインと呼ばれるサーバのホスト名) %d 日 %m 月(数字) %M 月(英語3文字表記) %y 年(最後の2桁) %Y 年(4桁) %Z 年(2桁か4桁ですが、非効率です) %h 時 %n 分 %a %h が 12 時間制で "A" は午前、"P" は午後("am"という文字には $am と %aM が必用 ) %U Unix 時間(GMT 1970 年を基準としたエポック秒)。秒数を含む場合は %U.%j %b 転送したバイト数 %t プロセスの処理にかかった秒数 %T プロセスの処理にかかったミリ秒数 %D プロセスの処理にかかったマイクロ秒数 %c HTTP ステータス・コード %C HTTP ステータス・コードを示す文字列 -- 内部的に使います %j ゴミ。項目を無視します(項目が空白でも適用されます) %w 空白スペース、あるいはタブ %W 複数の空白スペース %% % 記号 \n 新規行 \t タブ \\ バックスラッシュ 例えば、common 形式のログの場合は次のような指定になります。 jay.bird.com - fred [25/Dec/1998:17:45:35 +0000] "GET /~sret1/ HTTP/1.0" 200 1243 (画面の都合上2行に渡っていますが、実際には1行です) LOGFORMAT (%S - %u [%d/%M/%Y:%h:%n:%j %j] "%j %r %j" %c %b) このように指定することも出来ます。一方で、上記の例のようにホスト名を表す %S やユーザー名を表す %u などが無くても書式として analog は認識できます(項目が空白であれば、存在しないものとして置き換えられますので、問題ありません)。他の例を見てみましょう。例えば次のようなログがあったとします。 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) (画面の都合上2行に渡っていますが、実際には1行です) LOGFORMAT (%j %d/%m/%y %h:%n%am, %r, %S, %c, %b, %f, %B) [覚えておいてください] もし LOGFORMAT コマンドの文字列の指定で問題が起こった時はデバッグ・モードを有効?(>#debugs)にして、各行をどのように識別しているか確認してみてください。もし解決できないようでしたら、analog-help メーリングリスト(英語)に問い合わせてみてください。 ログファイルの中で複数の書式を用いても解析することができます。複数の形式を 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 には common 形式と combined 形式のログが混在しています。log2 と log3 には直前の LOGFORMAT で指定された形式のログとして認識されます。 複数のログ形式を指定している場合、analog はまず1行目を見てどのような形式か判別します。そのあと、また同じ形式かどうか、それとも違うかどうかを繰り返して必用に応じて読み込む形式を変更しています。通常特に指定がなければ common 形式での認識を試みて、その次以降の行は識別時間を短縮するため、同一の形式かどうかだけ判断するようになっています。 |