D. J. Bernstein
UNIX
daemontools

multilog プログラム

multilog は標準入力から一続きの行を読み、任意の数のログに選択された行を追加します。

使い方

     multilog script
script はいくつかの引数から成ります。 各引数は一つの動作を明記します。 その動作は入力の各行の順に実行されます。 multilog がシェルから起動されるとき、動作は引用符で囲まれる必要があるシェルのメタキャラクタを含めてもよいことに注意してください。

標準入力の終りに達すると multilog はコード0で終了します。 標準入力の最終行に改行がなければ、multilog は改行を挿入します。

メモリ不足が起きたときや、 別の multilog プロセス がすでに同じ自動切り替えのログに書いているときには、入力を読むのをやめ、標準エラーにメッセージを書き出して、コード111で終了します。

いったん入力を読み始めたあとにディスクへの出力でトラブルがあると、 multilog は標準エラーにメッセージを書いて、休止し、再度試みます。 データが失われることはありません。 これによりmultilogの入力を生成している側のプロセスがブロックされることになるかもしれないことに注意してください。

multilog は TERM シグナルを受け取ると、データを次の改行コードまで読み込んで処理したあと、終了します。 このとき、標準入力はまだ処理されていないデータの先頭を指しています。

行の選択指定

各行は最初は選択されています。 動作
     -pattern
pattern が行に合えばその行の選択が解除されます。 動作
     +pattern
pattern が行に合えばその行は選択されます。

patternは * とそれ以外からなる文字列です。 それは同じ順番で全ての * とそれ以外の文字に合う文字列をつなぎ合わせたものに合います。 * でない文字は文字自身に合います。 pattern の最後ではない * は pattern で直後に現れる文字を含まない任意の文字列に合います。 pattern の最後にある * は任意の文字列に合います

例えば、動作

     +hello
hello を選択します。 hello world は選択しません。

動作

     -named[*]: Cleaned cache *
named[135]: Cleaned cache of 3121 RRs の選択を解除します。 最初の * は ] を含まない任意の文字列に合います。

動作

     -*
は全ての行の選択を解除します。

メモリを消耗しないように、実際には multilog は各行の最初の 1000 文字のみに対して pattern を調べます。

警告

動作
     e
は標準エラーに選択された各行(の最初の200バイト)を出力します。

Status ファイル

動作
     =file
file の中身を選択された各行(の最初の1000バイト)で置き換えます。このとき、足らない部分を 1001 バイトまで改行コードで埋めます。 電源断に対しては file は保護されません。

例えば、一続きの動作

     -*
     +STAT*
     =log/status
STAT で始まる最新の行のコピーとして log/status を維持します。

タイムスタンプ

動作
     t
は各行の先頭に @ と正確なタイムスタンプとスペースを挿入します。これは tai64n と同じ形式を用いています。 これは最初の動作にだけ必要とされます。 タイムスタンプが挿入された後に、パターンが行に適応されます。

tai64nlocal を使って、そのタイムスタンプを人が読める形式に変換できます。

ログの自動切り替え

dir がドットやスラッシュで始まっていれば、動作
     dir
はログ dir へ選択された行を追加します。 dir が存在しなければ、multilog は作成します。

ログの形式は以下の通りです。 dir はディレクトリです。古いログファイル郡とログファイル currentmultilog がその動作の記録するための他のファイルがあります。 古いログファイルの名前は @ で始まり、そのファイルがいつ終了したのかを示す正確なタイムスタンプがそれに続き、次のようなコードの一つを付けて終ります。

NFS や async ファイルシステムや softupdates ファイルシステムは電源切断前にディスクに安全に書き込まれなかったファイルを捨てるかも知れまないことに気をつけてください。

multilog が動いている間は、current のモードは 644 です。 multilog は標準入力の終りに達したら、 current を安全にディスクに書き込み、current のモードを 744 に設定します。 再起動したとき、current のモードは 644 に戻され、新しい行を書き続けます。

multilogcurrent が十分大きいと判断したら、current を安全にディスクに書き込み、current のモードを 744 に設定し、current を古いログファイルとして名前を変えます。

動作

     ssize
は続いて記述される動作 dir の最大ファイルサイズを設定します。 multilogcurrentsize バイトであれば、十分大きいと判断します。 (multilog は最大ファイルサイズの最後の 2000 バイト以内に改行コードがあれば、十分大きいと判断します。行の境目でログファイルを終らせようと試みるためです。) size は 4096 と 16777215 の間でなければなりません。 デフォルトの最大ファイルサイズは 99999 です。

動作

     nnum
は続いて記述される動作 dir のログファイルの数を設定します。 current の名前を変えた後に、num 個以上の古いログファイルがあれば、multilog は最小のタイムスタンプが付いている古いログファイルを削除します。 num は 2 以上でなければなりません。 デフォルトのログファイルの数は 10 です。

動作

     !processor
は続いて記述される動作 dir で使うプロセッサを設定します。 multilogprocessor を通して current にデータを与え、current の代わりに古いログファイルとして出力を保存します。 multilogprocessor が記述子 5 に書き出すどんな出力も保存し、processor を次のログファイルで動かしたときに その出力を記述子 4 で読めるようにします。 信頼性のために、processor はその出力を作成するときに問題が生じたら 0 でないコードで終了しなければなりません。multilog は再びそれを起動させます。 processor を動かすことは multilog に入力を与えるプログラムを止めてしまうかも知れないことに注意してください。
(訳注:この段落の訳はかなり怪しいです。訳者自身もその動作を理解できていません。原文を読んでください。)
訳:滝澤 隆史
(Version 0.61 における前野 年紀 氏による訳をベース)
Last modified: Sat May 6 22:04:51 2000