Cygwin には他の Unix 類と同じくロギングのための syslog 機能があります。 syslog 関数は cygwin パッケージ本体に, logger コマンドや syslogd デーモンは Net カテゴリの inetutils パッケージに それぞれ収録されています。
01:~$ cygcheck -f /usr/include/syslog.h cygwin-1.5.19-4 01:~$ cygcheck -f /usr/bin/logger inetutils-1.3.2-35 01:~$ cygcheck -f /usr/sbin/syslogd inetutils-1.3.2-35 01:~$
inetutils パッケージは,必須の Base カテゴリではありませんから, 必ずしもインストールされているとは限りません。 普通の Unix で考えると, デーモンがないのに syslog 関数だけあっても役に立たないように思えます。 しかし,Cygwin の syslog はそうではありません。 Windows 上のシステムであることを活かしています。
syslog 機能については下記の§13.4.2 の解説がよくまとまっています。 *1。
リチャード・スティーヴンス著, 大木敦夫訳 「詳解 UNIX プログラミング」,ソフトバンク刊, 1994年, ISBN 4-89052-524-6 (原書: W. Richard Stevens: "Advanced Programming in the UNIX Environment", Addison-Wesley, 1992.)
Unix アプリケーションからは最低限 syslog 関数を使うだけで syslog 機能を利用できます。 前述のようにこの関数は cygwin 本体に含まれています。 簡単なプログラムを作って実験してみます。
#include <syslog.h>
int main()
{
syslog(LOG_NOTICE, "This is a NOTICE test.");
return 0;
}
という内容の log_test.c を用意して (もちろん C コンパイラの gcc-core パッケージをインストールして) コンパイルして実行します。
01:~$ gcc log_test.c 01:~$ ./a.exe 01:~$
ここで疑問に思うかもしれません。 普通の Unix なら出力の受け手になるはずの syslogd デーモンがなく, その Unix ドメイン・ソケット /dev/log が設けられていない状態で, ログは一体どこに書かれたのでしょうか? 実はこのとき,Windows 上のプログラムにふさわしく, Windows のイベントログに書かれています。
アプリケーションのイベントログを確認してみます。
「マイコンピュータ」で右クリック → メニューから「管理」を左クリック → 左ペインの「システムツール」ツリーの「イベント ビューア」を左クリック → 現れた「アプリケーション」を左ダブル・クリック
下図に示すように種類が「情報」, ソースが「Cygwin」のイベントが記録されています。 イベントの行をダブルクリックすると詳細情報を見ることができます。 確かに syslog 関数に与えたログのメッセージが記録されています。 *2。
他の Unix 類と同じく, シェルスクリプトやコマンドラインから手軽に syslog 機能を使う手段として logger コマンドが用意されています。 前述したように,このコマンドは Net カテゴリの inetutils パッケージに含まれています。たとえば,
01:~$ logger hello world
とすると,hello world がログ出力されます。
イベントの種類は -p オプション, イベントのソース名は -t オプションで指定できます。 たとえば下記のようにすると, エラー・イベントがソース名 Test でログ出力されます。
01:~$ logger -p user.err -t Test "エラーのテスト"
前節のように確認すると,
右図のとおり,確かにエラー・イベントがソース名 Test で記録されています。
logger コマンドの詳細については man ページを参照してください。 現行の inetutils-1.3.2-35 パッケージではなぜか man logger ではなく man syslog で閲覧できるようです (パッケージングのミスでしょうか)。
ただし,
この man ページは BSD Unix からそのまま持ってきたものです。
(事実,Mac OS X "Tiger" の
man logger と同一の内容です)。
Cygwin のオリジナルである Windows イベントログ機能については,
依拠している syslog 関数の Cygwin ソースにあたるしかない模様です。
ここで syslogd デーモンの説明に入る前に, Cygwin の「サービス」について簡単に述べます。
Unix のデーモンにあたるものとして,Windows には「サービス」があります。 概念的には同じようなものですが, 登録や登録取消,起動や終了などの管理体系が異なります。 普通の Unix ならばデーモンとして恒常的に動作させるプログラムを, Cygwin では Windows のサービスとして動作させます (ただし,デーモン的な動作をするプログラムであっても, 一時的に利用するだけのもの,とりわけその時その時で設定を変更するものは, サービスではなく, コマンドラインからの普通のバックグラウンド・プロセスとするのが普通です)。
サービスの登録や登録取消,開始や停止,状態照会等を Cygwin のコマンドラインやシェルスクリプトから実行するために cygrunsrv コマンドがあります。 これは同名のパッケージ (現行版は cygrunsrv-1.12-1) に収録されています。 ドキュメントとして,同パッケージからコマンドとともにインストールされる 下記の英文テキストがあります。
/usr/share/doc/Cygwin/cygrunsrv.README
コマンドオプションのまとめは cygrunsrv の -h または --help オプションで得られます。
01:~$ cygrunsrv -h
ただし,サービスは必ずしも cygrunsrv 経由でなければ管理できないわけではありません。 Cygwin でのサービスは,本物の Windows の「サービス」です。 Windows ネイティブの「コンピュータの管理」ウィンドウで管理でき, Windows ネイティブのコマンド net start および net stop でも開始と停止ができます。 たとえば以下の説明で「cygrunsrv -S syslogd」とあったとき, それを「net start syslogd」で置き換えることができます。
setup.exe で Cygwin パッケージを更新するときは, 普通の Cygwin プロセスをすべて終了させるとともに, cygrunsrv 経由で登録したサービスを停止しておく, できればいったん登録を取り消しておくのが安全です。
syslogd デーモンは logger コマンドと同じく inetutils パッケージに含まれています。 インストール後,最初の1回は syslogd-config を実行し,yes と打鍵して syslogd をサービスとして登録します (これはシェルスクリプトであり,内部で cygrunsrv コマンドを使用しています)。
01:~$ syslogd-config Creating default /etc/syslog.conf file Warning: The following function requires administrator privileges! Do you want to install syslogd as service? (Say "no" if it's already installed as service) (yes/no) yes The service has been installed under LocalSystem account. To start the service, call `net start syslogd' or `cygrunsrv -S syslogd'. Check /etc/syslog.conf first, if it suits your needs. Keep in mind that any file mentioned in /etc/syslog.conf must exist and be readable and writable for the SYSTEM account. Oh and, use tabs, not spaces in /etc/syslog.conf... Configuration finished. Have fun! 01:~$
cygrunsrv -L または --list で,cygrunsrv 経由で登録されているサービスのリストが見られます。
01:~$ cygrunsrv --list syslogd 01:~$
cygrunsrv -S または --start でサービスを開始できます。
01:~$ cygrunsrv --start syslogd 01:~$
cygrunsrv -Q または --query で状態を照会できます。
01:~$ cygrunsrv --query syslogd Service : syslogd Display name : CYGWIN syslogd Current State : Running Controls Accepted : Stop Command : /usr/sbin/syslogd -D 01:~$
cygrunsrv -E または --stop でサービスを停止できます。
01:~$ cygrunsrv --stop syslogd 01:~$
cygrunsrv -R または --remove でサービスの登録を取り消すことができます。
01:~$ cygrunsrv --remove syslogd 01:~$
cygrunsrv -I または
--install
でサービスを登録できますが,
各種のオプション情報が必要ですから,
syslogd-config のような専用のユーティリティが用意されているときは,
それを利用するのが確実です。
syslogd デーモンを開始すると, /dev/log という Unix ドメインのソケットが設けられます。
01:~$ ls -lF /dev total 1 srw-rw-rw- 1 SYSTEM root 53 Jan 26 15:52 log= 01:~$
/dev/log は syslogd デーモンを停止すると消されます。 ここで下記の2点が重要です。
ファイル /var/log/messages は, syslogd-config を実行したときに (もし無ければ) 作られます。 syslogdを開始すると, (/etc/syslog.conf の設定にしたがって) syslogd 自身のログ・メッセージが書かれます。
01:/va/log$ cygrunsrv --start syslogd 01:/va/log$ cat messages Jan 27 10:42:38 december syslogd: restart Jan 27 10:42:39 december syslogd: PID 3488: `syslogd' service started 01:/va/log$
ここで logger コマンドなどによって syslog 関数を使うと, そのログ出力が /var/log/messages に追加されます。
01:/va/log$ logger "Pluvas kaj pluvas kaj pluvas kaj pluvas" 01:/va/log$ cat messages Jan 27 10:42:38 december syslogd: restart Jan 27 10:42:39 december syslogd: PID 3488: `syslogd' service started Jan 27 10:46:18 december suzuki: Pluvas kaj pluvas kaj pluvas kaj pluvas 01:/va/log$
Cygwin には,syslogd に代わるオルタナティブなデーモン実装 syslog-ng (パッケージ名も syslog-ng) も用意されています。 次世代 (next generation) ないし新世代 (new generation) *3 の syslog デーモンというわけですが, ここで説明した範囲についていえば,使い方は syslogd と全く同じです (つまり,すぐにでもリプレースできます)。 設定ユーティリティとして syslogd-config の代わりに syslog-ng-config を使います。
ただし,現行版の syslog-ng-1.6.9-1 は, デーモンを停止しても /dev/log を消しません。 このとき syslog 関数のログ出力はどこにも書かれずに捨てられます。 もしも Cygwin の現行の syslog-ng を利用する場合は,システムの動作中, デーモンを停止させないことを前提とするのがよいでしょう。
*1 この本は Unix プログラミングにおいて必携の書といってもよいでしょう。 自分自身,この本に何度助けられたか分かりません。
*2 図ではビューアの説明に「イベント ID …に関する説明が見つかりませんでした。…」 と長々しく書かれています。 これはそのイベント・ソースが Windows に登録されていないことが原因です。 Windows のイベントログは, 文字列だけでなく一般に不可視かもしれないデータを記録します。 Windows にイベント・ソース名を登録するとき, データを適切に書式化する DLL ファイル名をレジストリに情報として書き込みます。 ビューアは,ソース名から DLL ファイルを検索して,データ表示に利用するわけです。
下記のようにしてソース名ごとにレジストリ情報があることを確認できます。
01:~$ ls /proc/registry/HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Application/
くだんの長々しい説明は,該当するレジストリ情報が見つからない, あるいはレジストリで指定された DLL ファイルが見つからない, という実装詳細をそのまま述べたものです (Windows の他のいくつかの点と同じく,これはセンスのないやりかたです。 素人には意味不明な呪文,玄人には冗長な説明です。 「この情報は書式化されていません」 などと1文添えるだけで十分だったはずです)。
*3 syslog-ng の一次配布場所であるハンガリーの BalaBit (http://www.balabit.com) からオリジナル版のソース syslog-ng-1.6.9.tar.gz をダウンロードして調べると, syslog-ng.spec.bb ファイルでは "Next generation system logging daemon", 同梱されている debian/control ファイルでは "Next generation logging daemon" としていますが, INSTALL ファイルでは syslog-ng は syslog-new-generation を意味するとしており,「次世代」と「新世代」が両論並立しています。