クラス: wxLog,
wxLogStderr,
wxLogStream,
wxLogTextCtrl,
wxLogWindow,
wxLogGui,
wxLogNull,
wxLogChain,
wxLogPassThrough,
wxStreamToTextRedirector
これは wxWidgets の提供するロギングクラス全般の概要です。ここでのロギングという言葉は広い意味を持っており、非対話形式のメッセージに限らず、プログラムの出力すべてを含んでいます。wxWidgets のロギング機能では ログターゲット に対する標準的なインタフェースを定義する基底 wxLog クラスや、いくつかのログクラスの標準的な実装とそれを使用する関数群を提供しています。
まず最初に、wxLog クラス郡を使用するのにその知識は必要とされません。そのため、wxLogXXX() 関数についてのみ、知っておく必要があります。これらの関数はすべて printf() や vprintf() と同じ構文を持ちます。つまり、第一引数にフォーマット文字列を取り、続けて可変引数か可変引数リストのポインタを取ります。以下にすべての関数を示します:
これらの関数の用途はかなり明確ですが、なぜ C の標準入出力関数や C++ のストリームといった他のロギング機能を使用しないのか疑問に思うかもしれません。簡単に答えれば、それらの関数やストリームは確かに優れた汎用的な仕組みを持っていますが、本当に wxWidgets に適しているとは言えないためです。wxWidgets のログ関数を使用するいくつかの利点は以下の通りです:
以下のように書くことで wxLogXXX 呼び出しを cout へリダイレクトすることもできます:
wxLog *logger=new wxLogStream(&cout);
wxLog::SetActiveTarget(logger);
最後に、wxStreamToTextRedirector クラスを使用することで cout へ出力した内容を wxTextCtrl にリダイレクトすることもできます。
メッセージのロギングに通常使用するすべての関数と、それらを使用する理由について列挙したので、これらの動作方法について説明します。
wxWidgets では ログターゲット という考え方があります: これは単純に wxLog を継承したクラスです。そのため、メッセージのロギング時に呼ばれる基底クラスの仮想関数を実装ています。いつでも 有効な ログターゲットはひとつだけで、これが wxLogXXX() 関数によって使用されます。ログオブジェクト (つまり、wxLog を継承したクラスのオブジェクト) の通常の使用方法は SetActiveTarget() を使用して有効なターゲットとして設定することで、それ以降に呼び出された wxLogXXX() 関数で自動的に使用されるようになります。
新しいログターゲットクラスを作成する場合、wxLog を継承し、DoLog() と DoLogString() のどちらか (または両方) を実装するだけです。標準的な wxLog メッセージの形式 (先頭に "Error:" か "Warning:" とタイムスタンプが付きます) で充分だが、メッセージを他の場所へ送りたい場合は 2 番目の関数を実装するだけで充分です。最初の関数をオーバーライドすると何でもできますが、異なるメッセージ型を自分で区別する必要があります。
wxLog を継承したクラスがいくつか事前に定義されており、新しいログターゲットクラスを作成する際の参考になると思います。もちろん、そのまま使用することも可能です。以下にその一覧を示します:
wxFile file;
// 通常はファイルを開けなかった場合に wxFile.Open() がエラーメッセージを出力するが、そうさせたくない
{
wxLogNull logNo;
if ( !file.Open("bar") )
... 自分自身でエラー処理を行なう ...
} // ~wxLogNull が呼ばれ、古いログ出力先が元に戻される
wxLogMessage("..."); // ok
ログターゲットは組み合わせて使用することもできます: 例えば、メッセージを他の場所 (例えばログファイルなど) にリダイレクトしつつ、通常通りの方法でも処理したいとします。このために wxLogChain と wxLogPassThrough を使用できます。