# アプリケーションからのメッセージの表示とログ採取

アプリケーションを実行しているユーザは、メッセージ・フッタ、エラー・ダイアログ、または警告ダイアログにメッセージが表示され、適宜詳しい説明がオンラインヘルプにあることを期待します。 環境によっては、ユーザにとって表示する必要のないメッセージがログされることもあります。 共通デスクトップ環境のアプリケーションは、エラー・メッセージと警告を表示しログ採取するための共通モデルに従います。

PG.msgs.mkr.2
PG.msgs.mkr.3
PG.msgs.mkr.4
PG.msgs.mkr.5

## エラー・メッセージの表示方法

メッセージ・テキストの処理方法のために、ダイアログ、フッタ、または別のユーザ・インタフェースのどこかに表示しないと、ユーザはアプリケーションからのメッセージを見ることができません。

CDEでは、そのようなメッセージは、通常のユーザが定期的に調べることのないログ・ファイルに出力されます。 警告、メッセージ、及びエラー条件を表示する場所を決めるときには、次の規則に従ってください。

- 情報を示すメッセージの場合は、 アプリケーションのメッセージ・フッタにテキストを表示します。 たとえば、「MyDocファイルがコピーされました」のようになります。

- エラーまたは重大な警告についてのメッセージの場合は （ユーザにとって重要な操作が失敗した場合のトラブルなど）、 エラー・ダイアログまたは警告ダイアログに表示します。

## エラー・ダイアログに表示する情報

優れたエラー・ダイアログまたは警告ダイアログでは次の情報を表示します。

- なにが起きたか(ユーザの視点から)

- 原因（ユーザが現在の作業と環境に関連づけて理解できるような簡単な表現で）

- 問題の解決方法

４、５行のエラー・ダイアログで説明できない場合には、ダイアログに[ヘルプ]ボタンを追加して、それをアプリケーションのヘルプ・ボリューム内のトピックにリンクすることを検討してください。

メッセージの作成の詳細については、 共通デスクトップ環境 国際化対応プログラマーズ・ガイドを 参照してください。

## メッセージ・ダイアログとオンライン・ヘルプのリンク

追加の背景情報が必要な場合や、４、５行のダイアログではエラーを十分に説明できない場合には、オンライン・ヘルプにリンクするボタンを追加することができます。

ダイアログのオンライン・ヘルプの追加、簡単な作業でできます。 特定なダイアログをオンライン・ヘルプの候補として決めたら、次のようにします。

1. エラー・ヘルプに対して固有なIDを選びます。

   このIDがオンライン・ヘルプ・テキストへのリンクとなります。 IDは、６４文字以下でなければなりません。たとえば、 `DiskSpaceError`のようになります。

2. ダイアログを作成して、ヘルプ・コールバックを追加します。

   エラー・メッセージに対しては`XmCreateErrorDialog`簡易関数を、警告に対しては `XmCreateWarningDialog`簡易関数を使用して、次のようにヘルプ・コールバックを追加します。

       XtAddCallback(dialog, XmNhelpCallback, helpfn, “ID”);

   この例では、helpfnはヘルプ・ダイアログを管理するために作成したヘルプ関数であり、文字列「ID」はエラー・メッセージに対して選んだIDです(たとえば`DiskSpaceError`)。ヘルプ関数では、`XmNlocationId`リソースをIDの値に設定します。`/usr/dt/examples/dthelp`デイレクトリに、このようなヘルプ関数の設定例があります。

   ヘルプ・ダイアログ・ウィジットの作成と管理の詳細については、 共通デスクトップ環境　ヘルプ・システム 設計者およびプログラマのためのガイドを参照してください。

3. エラー・メッセージに対応するヘルプ・セクションを書きます。

   ヘルプ・ボリュームの「メッセージ」の章に、メッセージの説明を書きます。 ヘルプのソース・ファイルでは、メッセージごとにセクションを設けなければならず、セクションの始めのID=属性は、コードの中でエラーに対して選んだIDと一致しなければなりません。

   たとえば、`s1`セクション見出しでは、IDは`DiskSpaceError`です。

   次の見出しは、ユーザのシステムに十分なデイスク領域がないときに、「ファイルをセーブできません」というエラー・メッセージを表示します。

       <s1 ID=DiskSpaceError>Could Not Save File <\s1>

   規則によって、セクションの見出しのテキストはエラー・ダイアログと一対一に対応しなければならないので注意してください。

4. ヘルプ・ファイルを再作成します。

   エラー・メッセージに対する新しいヘルプ・セクションは、ヘルプ・ファイルを再作成して (`dthelptag`プログラムを使用して)、アプリケーションを再コンパイルするとすぐにアクティブになります。

オンライン・ヘルプの記述と作成の詳細については、共通デスクトップ環境　ヘルプ・システム 設計者およびプログラマのためのガイドを参照してください。

## 回復処理ルーチン

エラー条件のための回復処理ルーチンがある場合には、ダイアログに[再実行] ボタンを追加することを検討してください。 たとえば、システムのディスク領域が不足しているためにファイルをコピーできなかった場合、ダイアログに[再コピー]オプションがあれば、ユーザはディスク領域やアクセス権の問題を訂正してから、そのオプションを選ぶことができます。

## メッセージ・ログ採取の使用

メッセージ・ログ採取・サービスはCDEアプリケーションのメッセージのログを取ります。 このサービスは、 ユーザやシステム管理者が問題を診断するために使用できるメッセージの位置を提供します。 デスクトップ環境では、アプリケーションは`ファイル・マネージャ`または`フロント・パネル`を経て (シェルからの直接呼び出しに対抗するものとして)開始します。 アプリケーションが重要な情報を`stderr`に書く場合に、その情報が失われることがあります。 ですから、ユーザがその情報をログ内で見つけられるように、アプリケーションはCDEメッセージ・ログ採取・サービスを使用しなければなりません。 ユーザ・インタフェースを持たないライブラリやアプリケーションも、メッセージのログを取るためにこのサービスを使用します。 このようなアプリケーションは、システム・コンソールや`stderr`に出力する代わりに、メッセージ・ログ採取・サービスを使用しなければなりません。

メッセージ・ログ採取・サービスは、次の型のメッセージをサポートします。

- 情報：　ユーザが警告を受ける必要のない情報メッセージ（たとえば、ステータス情報など）。ユーザにとっては、この型のメッセージは見なくてもよいかもしれません。

- 標準エラー出力：　アプリケーションが、子プロセスから`stderr`のログを取る必要がある場合は、その`stderr`は、Stderrメッセージ型としてログ採取されなければなりません。たとえば、`dtexec`プログラムは、このメッセージ型を ログを取るメッセージを識別するために使用します(コマンド型のアクションからの`stderr`)。

- デバッグ：　アプリケーションからのデバッグ・メッセージ (たとえば、`-debug`コマンド行オプションが使われたときに出力されるメッセージ )は、デバッグ型メッセージとしてログ採取されなければなりません。

- 警告：　アプリケーション・プログラムを終了させるほど重大なエラーではない場合です。

- エラー：　プログラムを終了させなくてはならないほど致命的なエラーの場合です。

ユーザ・インタフェースを持たないデモン型のアプリケーション（たとえば、`inetd`によって開始される低レベル・サービスなど）は、 CDEメッセージ・ログ採取・サービスよりもシステムのsyslogサービスを使う方が向いています。

### ログ項目の書式

メッセージ・ログの項目と書式を次に示します。

`***` msgtype_string `(`msg_type`):` program_name`: PID` proc_id`:` date

_text

`*** [`bytes_output`]`

たとえば

    *** WARNING(3): fontview: PID 12312: Thu Jun 13 16:51:51 1995
    The specified font 'fixed' could not be loaded.
    *** [109]

日付の後に改行、テキストの後に改行、そしてバイト数の後に２行改行（空白行が各ログ項目を分けます） 型の文字列と日付指定は、現在のロケールのメッセージ・カタログから検索されなければなりません。 ログを取るためにメッセージを配置することは、アプリケーションの責任です。

### メッセージ・ログ採取API

メッセージ・ログ採取APIには、次の機能があります。

- `DtMsgLogMessage`：　メッセージ・ログにメッセージのログを取る。

- `DtMsgLogSetHandler`:　アプリケーションが`DtMsgLogMessage`を呼び出したときに呼び込まれる代替メッセージ・ログ採取ハンドラを組み込む。 この機能はオプションで、デフォルトのメッセージ・ログ採取ハンドラを取り消すときだけ使用します。

- `DtMsgLogOpenFile`：　メッセージ・ログ・ファイルを開きます。