Console service
出典: MDC
コンソールサービスインタフェース は、任意のソースからの、実行時のメッセージのロギングをサポートします。メッセージは、エラーコンソール上でユーザのために表示されたり、ディスクへ出力されたりします。
目次 |
[編集] 基本ロギング
Mozilla では 3 つの中心となるオブジェクトがハイレベルのメッセージをロギングさせるのに使われます:
3 main objects are used for logging high-level messages in Mozilla:
- コンソールメッセージ
nsIConsoleMessage: 文字列のメッセージを格納しています - コンソールリスナー
nsIConsoleListener: コンソールメッセージの解釈を可能にします - コンソールサービス
nsIConsoleService: コンポーネントにメッセージをログ出力させ、メッセージ通知を受け取ろうというリスナーを登録します
[編集] コンポーネント開発者の視点で
以下の例は単純な文字列をログ出力する方法を示しています。Firefox ではエラーコンソールを使ってログを目に見える形にすることができます。メッセージは情報アイコンとともに表示されるでしょう。
[編集] 例 1. 単純な文字列のロギング (C++)
nsCOMPtr<nsIConsoleService> aConsoleService =
do_GetService( "@mozilla.org/consoleservice;1" );
aConsoleService->LogStringMessage(
NS_LITERAL_STRING( "a logging message" ).get());
[編集] 例 2. 単純な文字列のロギング (JavaScript)
var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"].
getService(Components.interfaces.nsIConsoleService);
aConsoleService.logStringMessage("a logging message");
[編集] アプリケーション開発者の視点で
ログとなったメッセージを見るためには、Firefox のエラーコンソールを開くか、自前の nsIConsoleListener を実装するかする必要があります。
基本的に、実装すべき唯一のメソッドは observe で、その後、registerListener メソッドで nsConsoleService の中にリスナーを登録します。
logMessage メソッドが呼ばれるたびに、自前で実装した observe メソッドも呼ばれます。 実装者の選択によって、それをユーザインタフェースにもディスク上にも表示でき、ログサーバへも送ることができます。
[編集] 例 3. 単純なリスナー
var theConsoleListener =
{
observe:function( aMessage ){
dump("Log : " + aMessage.message);
},
QueryInterface: function (iid) {
if (!iid.equals(Components.interfaces.nsIConsoleListener) &&
!iid.equals(Components.interfaces.nsISupports)) {
throw Components.results.NS_ERROR_NO_INTERFACE;
}
return this;
}
};
function onLoad()
{
var aConsoleService = Components.classes["@mozilla.org/consoleservice;1"]
.getService(Components.interfaces.nsIConsoleService);
aConsoleService.registerListener(theConsoleListener);
}
[編集] nsIConsoleMessage を使ったさらなる楽しみ
nsIConsoleMessage の単純な実装は nsConsoleMessage によって操作されることです。nsConsoleMessage は、logStringMessage メソッドによって使われます。
特定の問題に応じて、より特化したクラスが必要になるかもしれません。nsIConsoleMessage を派生させ、新しい属性やメソッドを追加することもできます。 nsIConsoleListener を使うためには message 属性も実装しなくてはなりません。
特定の問題が起きたときに、QA 部門へメールを送信できるコンソールリスナーを思い描きます。
[編集] メッセージのロギング
コンソールサービスは、ユーザや UI/コンポーネント開発者に関係のある、任意のメッセージをロギングするのに使われます。コンソールサービスは、現在のところ、XUL とコンテント JavaScript、XPI JavaScript、JS コンポーネントからのメッセージを受け取ります。その他の候補としては、Prefs、XML パーサと XPConnect があります。エラーリストは、JavaScript UI からフィルタリングすることを意図しているので、ロギングするものとは区別されていません。
メッセージをロギングするためには、(コンソール) サービスの LogStringMesssage を呼び出してください。もし、メッセージに対して単なる文字列以上の情報を関係づけたいのであれば、nsIConsoleMessage への QueryInterface を呼び出すことができる XPCOM オブジェクトを作成し、そして (コンソールサービスの) LogMessage を呼んでください。例えば、現在、JavaScript エラーは、nsIScriptError (nsIConsoleService を継承しているインタフェース) のインスタンスをロギングしています。コンソールリスナーは、その後 QueryInterface を使って、nsIConsoleMessage より情報の多い、自分が知っているメッセージタイプを得ることができます。JavaScript コンポーネントローダー は、メッセージのロギングの例です。
[編集] スレッドセーフ
コンソールサービスは、スレッドセーフであることを意図しています。どのスレッドからもメッセージをロギングできなければいけません。サービスに登録されたリスナーは登録時にプロキシ化 【訳注: リスナーが直接呼ばれるのではなく、プロキシを経由して呼ばれることを指すと思われる。[nsISupports_proxies】 されます。新しいメッセージがロギングされる時に、それぞれのリスナーは、登録された元のスレッド上で (非同期に) 通知されます。(そのため、それぞれのリスナーはイベントキューを持つスレッドで登録されなければなりません。)
[編集] 古いメッセージの破棄
無制限のエラーを生成するページによるサービス拒否を防ぐために、コンソールサービスは、LIFO の循環式メッセージバッファを保持しています。そして、メッセージが上限に達すると古いメッセージの破棄を開始します。
[編集] エラーコンソール
コンソールサービスのひとつのクライアントは、Firefox のエラーコンソールです。(ツール > エラーコンソールで開きます) エラーコンソールは、その時までにロギングされたメッセージのためにコンソールサービスをポーリングします。そして、新しいメッセージのためにサービスに自分自身をリスナーとして登録します。コンソールサービス自身は JavaScript に依存しません。コンソールサービス上のすべてのものはスクリプティング可能であり、エラーコンソールのウィンドウは純粋な XUL/JavaScript で実装されています。
Martijn Pieters のおかげで、エラーコンソールのためのコマンドラインハンドラがあります。(Firefox の) 起動時にエラーコンソールも同時にスタートさせるには -jsconsole オプションを使ってください。
[編集] 原文書の情報
- 著者: Mike McCabe, David Olivari
- 最終更新日: May 7, 2000
- 著作権: Portions of this content are © 1998–2007 by individual mozilla.org contributors; content available under a Creative Commons license | 詳細