2.2. ログ出力

トレース機能

トレース機能は、主にデバッグのために使用します。内容の種類ごとにトレースの表示非表示を切り替えることができます。Trace クラスのシングルトンインスタンスを作成し、SetFlag() に表示したい項目のフラグの論理和を指定します。

コード 2-2. Trace
nn::pia::common::Trace::CreateInstance();
nn::pia::common::Trace::GetInstance()->SetFlag(
    nn::pia::common::TraceFlagCommon |
    nn::pia::common::TraceFlagSession
 );

レポート機能

レポート機能は、主に動作の確認と記録のために使用します。nn::pia::common::Initialize() 関数を実行すると、 Pia 内部で暗黙的に Report クラスのインスタンスがデフォルトで作成され、レポート機能が利用できるようになります。 ただし、アプリケーションプログラム側で(デフォルトの Report インスタンスを変更せずに)レポート機能に独自設定を施す必要がある場合には、Report クラスのインスタンスを作成して SetMask() などを適用し、 Report::SetGlobalObject 関数に渡します。

コード 2-3. Report
nn::pia::common::Report report;
report.SetMask(nn::pia::common::Report::LevelError | nn::pia::common::Report::LevelWarning);
nn::pia::common::Report::SetGlobalObject(&report);

キャッシュプリント

キャッシュプリントを使用すると、 Trace, Report でのコンソール出力が一時的にキャッシュされ、実際のコンソール出力を任意のタイミングまで遅延させることができます。複数のコンソール出力をまとめて実際のコンソール出力回数を減らすことにより、コンソール出力による処理の占有を軽減することができます。

この機能を利用する際は、CachedPrint クラスのシングルトンインスタンスを作成する必要があります。適当なタイミングで Flush() を呼ぶと、それまでにキャッシュされた文字列がコンソールに出力されます。キャッシュのためのバッファが不足した場合には古い文字列から上書きされますので、一部の文字列が出力されない場合には、バッファのサイズを増やすか Flush() の頻度を上げる必要があります。

CachedPrint のシングルトンインスタンスが生成されていない場合は、 Trace や Report は通常通りその場でコンソール出力します。

コード 2-4. CachedPrint
const uint32_t CachedPrintBufferSize = 32 * 1024;
nn::pia::common::CachedPrint::CreateInstance(CachedPrintBufferSize);
nn::pia::common::CachedPrint::GetInstance()->Flush();

アプリのプリントのうち Pia と同様にキャッシュさせたいものは、 PIA_BASIC_PRINTF(), PIA_BASIC_VPRINTF() マクロを使います。

経過時間の出力

Report クラスと Trace クラスの双方に、 SetPrintTime() 関数が用意されています。これらの関数に引数 true を指定して呼び出すと、ログ/トレース出力と同時に、基準時刻からの経過時間をミリ秒で出力するようになります。

コード 2-5. SetPrintTime
nn::pia::common::Trace::GetInstance()->SetPrintTime(true);

プリントフック機能

デバッグ用の機能として、プリントフック機能が用意されています。

この機能を用いると、Pia がコンソールに出力していた文字列をアプリケーションが加工したり、画面に描画するといった機能が実現できます。

コード 2-6. RegisterInternalPrintCallback
// フックするコールバック関数。nn::pia::common::InternalPrintCallback 型である必要があります。
void myCallback(const char* pStr, int32_t len)
{
    const uint32_t bufferSize = 80;
    char buf[bufferSize];
    const char* p = pStr;
    while(p < pStr + len)
    {
        strncpy(buf, p, bufferSize-1);
        buf[bufferSize-1] = '\0';
        drawText(buf); // 文字列を画面に描画
        p += (bufferSize-1);
    }
}


// コールバックを設定する関数。
void setPrintHookCallback()
{
    nn::pia::common::RegisterInternalPrintCallback(myCallback);
}