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