gauche.logger
- ユーザレベルのロギング ¶プログラムからログを書き出す簡単なインタフェースを提供します。
情報は指定されたファイルへ書き出されるか、もしくはsyslog(3)
を
使ってシステムログへと送られます。
ファイルに書き出される場合は、
syslogに似たプレフィクスが各メッセージの前に追加されます。
プレフィクスはカスタマイズすることもできます。
また、ログファイルの排他制御も行われます (下のlock-policy
の説明を
参照して下さい)。
{gauche.logger
}
ログメッセージの行き先を表現するオブジェクトです。
デフォルトのログの行き先として、グローバルな<log-drain>
のインスタンスが
ひとつ作られます。
ログをいくつかにわけて出力する場合などはmake
メソッドを使って
いくつでも<log-drain>
のインスタンスを作ることができます。
<log-drain>
: path ¶ログの出力先を指定します。以下の値をとることができます。
ログファイルのパスを指定します。出力はそのファイルへと書き出されます。
current-error
#t
出力は現在のエラーポートに向かいます。
current-output
出力は現在の出力ポートに向かいます。
syslog
出力はシステムログへと送られます。
ignore
log-format
が何もしないようにします。
#f
出力は文字列になってlog-format
からの戻り値となります。
このスロットの初期値は#f
です。
<log-drain>
: prefix ¶各メッセージの前に追加されるプレフィクス文字列を指定します。
メッセージが複数行に渡る場合、プレフィクスは各行の頭に追加されます。
またこのスロットには手続きをセットすることもできます。
その場合、プレフィクス文字列が必要とされる度にその手続きが<log-drain>
を引数として呼び出され、戻り値の文字列がプレフィクスとして使われます。
path
スロットの値がシンボルsyslog
の場合は、
このスロットの値は無視されます。システムのログ機構が適切なプレフィクスを付けるからです。
prefixスロットの値が文字列の場合、以下に挙げる文字シーケンスは特別な意味を持ち、
log-format
によって置換されます。
~T
現在の時刻を"Mmm DD hh:mm:ss"という形式で表したもの。 ここで"Mmm" は英語の月名の省略形、"DD" は日、"hh"、"mm"、 "ss" は時間(24時間制)、分、秒です。 このフォーマットはシステムログと同じです。
~Y
4桁で表した現在の西暦。
~P
プログラム名。初期値は(car (command-line))
の値のbasenameが使われます
(コマンドライン引数参照)。
下に述べるprogram-name
スロットの値を変えれば
ここに現れる文字列を変えることができます。
~$
このプログラムのプロセスID。
~U
このプロセスの実行ユーザ名。
~H
このプロセスが走っているホスト名。
このスロットの初期値は"~T ~P[~$]:
"です。例えば
"this is a log message.\nline 2\nline 3"というメッセージが
与えられると、次のようなログが書き出されます。
Sep 1 17:30:23 myprogram[441]: this is a log message Sep 1 17:30:23 myprogram[441]: line 2 Sep 1 17:30:23 myprogram[441]: line 3
<log-drain>
: program-name ¶プレフィクス文字列の~P
が置換されるプログラム名を指定します。
<log-drain>
: lock-policy ¶ログファイルのロックの方法を指定します。
このスロットの値がシンボルfcntl
だった場合は、
fcntl()によるファイルロックが使われます
(gauche.fcntl
- 低レベルファイル操作参照)。
このスロットの値がシンボルfile
だった場合は、
ログファイルのパス名に ".lock" を追加したロックファイルを作成することによる
排他制御が行われます。この場合、ログを行うプロセスはログファイルの
置かれるディレクトリに書き込み権限が必要です。
また、プロセスがログファイル書き込み中に強制的に終了させられた場合、
ロックファイルが残ってしまう恐れがあります。
Log-format
はロックファイルが十分に古い場合(現在は10分をリミットとしています)
ロックファイルを自動的に削除します。
このスロットの値が#f
だった場合は、排他制御は行われません。
デフォルトの値はfcntl
です。但しMacOSXではfcntlスタイルのロックが
サポートされていないため、file
がデフォルト値となります。
ログの行き先がファイルでない場合は排他制御は行われません。
<log-drain>
: syslog-option ¶<log-drain>
: syslog-facility ¶<log-drain>
: syslog-priority ¶これらのスロットの値は、ログの行き先がシステムログの場合にのみ使われます。
これらの値に関する説明はgauche.syslog
- Syslogを参照して下さい。
デフォルトの値はそれぞれLOG_PID
、LOG_USER
、LOG_INFO
です。
{gauche.logger
}
デフォルトのログの行き先をpathに指定します。
pathは文字列かboolean値あるいはシンボルsyslog
で、
上のpath
スロットで述べたものと
おなじ意味を持ちます。またプレフィクスとプログラム名をキーワード引数で
指定することもできます。
これらのパラメータの意味については上の<log-drain>
の項を参照して下さい。
名前に"open"とありますが、この手続きは指定されたファイルをオープンしません。
ファイルはlog-format
が呼ばれるたびにオープンされクローズされます。
{gauche.logger
}
引数無しで呼ばれると、log-format
が使う、
現在のデフォルトのログの行き先が返されます。
まだデフォルトのログの行き先がlog-open
で指定されていない場合は
#f
が返ります。
新たな<log-drain>
オブジェクトか#f
を引数にして呼び出すと、
デフォルトのログの行き先がそれに変更されます。
parameterize
(パラメータ) を使えば、一時的にデフォルトの
ログの行き先を変更できます。
{gauche.logger
}
ログメッセージをformat
手続きでフォーマットし(出力参照)、
指定された行き先に書き出します。最初の形式ではデフォルトの行き先が使われます。
ファイルはこの手続きが呼ばれるたびにオープンされクローズされます。
したがって、ログファイルに書き出すプログラムが走っている最中でも
ログファイルをmoveすることができます。
また、log-format
はsys-fcntl
(gauche.fcntl
- 低レベルファイル操作参照)
を使ってファイルロックを獲得します。
log-open
が呼ばれる前にlog-format
が最初の形式で呼ばれた場合、
log-format
は何もしません。したがって、log-format
をデバッグに
活用し、必要なくなったらlog-open
だけをコメントアウトする、というような
使用法も可能です。