syslog
はUNIXシステムで共通して使われるシステムログユーティリティです。
(訳注:syslog=カーネル(kernel)のメッセージ・リング・バッファー
を読んだり消去(clear)したりする)。
syslog
はFIFO(First In First Out)
と呼ばれるスペシャルファイルを開く
デーモンです。FIFOはパイプ(pipe)に似たスペシャルファイルです。
syslogデーモンはリードサイドからのデータを待ち、ライトサイドに書き込むための
C関数があります。もしこれらのC関数でプログラムを書けば出力はsyslogに入ります。
chroot
環境を使っていて、FIFO /dev/log
は仮想環境
には存在しないことに注意して下さい。これは全ての仮想環境がsyslogへの記録が
できないということを意味しています。プログラムは新しく作ったものの代わ
りとして/dev/log
を使えないので、ファイルを単にコピーすることもで
きません。
syslogの特定のバージョンにはudpソケットをFIFOの代わりに使っているものも ありますが、これは一般的なことではありません。
syslogは、コマンドラインで指定すれば、異なるFIFOを探します。 例えば以下のようにします。
syslog -p /virtual/logそして/dev/logを/virtual/logにリンクをはります(シンボリックリンク)。
ln -sf /virtual/log /dev/logつぎに以下のようにしてこのファイルに全ての
/dev/log
をリンクします
(これはハードリンクでシンボリックリンクではないことに注意)。
ln /virtual/log /virtual/domain.com/dev/log上記のvirtfsスクリプトではすでにこれを行っています。
/virtual
は一つ
の連続したディスクにあり、/dev/log
はリンクされているので同じinode
番号かつ同じデータを指すことになります。chroot
はこれをストップ
できないので全ての仮想/dev/log
は機能します。全環境からのメッセージ
は一つの場所に記録されます。しかしもしプログラムを書きたくなく、それぞれlog
ファイルを分けたいという場合は以下のようにして別々にsyslogを使うこともできま
す。
syslog -p /virtual/domain1.com/dev/log syslog -p /virtual/domain2.com/dev/logもっともこうすることはプロセスIDの浪費なのでお奨めしません。 このバージョンのsyslog.initは、不適切な設定がされている場合には起動する度に 毎回 /dev/log に再リンクしてしまいます。 以下、修正したsyslog.initファイルを挙げておきます。
#!/bin/sh # Source function library. . /etc/rc.d/init.d/functions case "$1" in start) echo -n "Starting dev log: " ln -sf /virtual/log /dev/log echo done echo -n "Starting system loggers: " daemon syslogd -p /virtual/log daemon klogd echo echo -n "Starting virtual dev log: " for i in /virtual/* do if [ ! -d "$i" ] then continue fi if [ "$i" = "/virtual/lost+found" ] then continue fi ln -f /virtual/log $i/dev/log echo -n "." done echo " done" touch /var/lock/subsys/syslog ;; stop) echo -n "Shutting down system loggers: " killproc syslogd killproc klogd echo rm -f /var/lock/subsys/syslog ;; *) echo "Usage: syslog {start|stop}" exit 1 esac exit 0