これまで見てきたように、データ収集系は多くのプロセスがからみあって働 いています。実験が順調に遂行しているかどうかを確認するためにはそれぞれ のプロセスが正しい状態で機能していることを常にチェックする必要がありま す。多数のプロセスがそれぞれ勝手に自分の標準出力にメッセージを書き出し ていては監視は大変です。また、ウインドウの中に多数のメッセージが次々に 表示され、読む暇もなくどんどんスクロールされていってしまうというのも困 ります。システム障害を追跡するためにも後でメッセージの解析が必要なこと もあります。このような検討から、システム全体からメッセージをかき集め、 わかりやすい形で表示し、必要に応じて記録していく機能が必要なことがわか ります。
実装は比較的簡単でしょう。ネットワークにUDPソケットを張って入ってく るメッセージを表示しファイルに書き出すだけのものでもなんとか間に合いま す。メッセージは必要な情報を含むものでなければなりません。発生した時刻 や、発生源の計算機・プロセス、事象の内容、原因、結果などです。このうち いくつかの項目は実装で共通に準備できるものです。また表示や記録の必要性 を表す、重要度もしくは深刻度といったパラメータをメッセージ毎に持たせる ことも考えられます。
メッセージを発生するサービス関数は、例えばプロセスの起動と停止を自動 的に通報するものや、標準的なシグナルハンドラーとして、内容ごとにその旨 を通報するもの、システムコールのエラーコードerrnoに対応するメッセージ を通報するものなどが考えられます。既に見てきたランコントローラの行いを そのまま通報するものやデータベース更新を通報するもの、それぞれプロセス 固有のものもあるでしょう。
(演習問題)
メッセージロギングプログラムを実装する。UDPソケットによりネットワーク上の任意の
計算機からメッセージを受信する。
メッセージ送信のための関数を用意する。
int log_open( char * prg ) ロガーとの通信の確立。
prgは送信時に付加されるプログラム名
int log_close( ) 通信の遮断
int log_send( char * msg ) メッセージ送信
メッセージロガーを設計する。
上述した関数の相手となるもの。
メッセージを標準出力に表示する。
時刻、発生源、メッセージを表示する
メッセージをファイルに書き出す。