ロギング¶
Kanzi ロギングシステムを使用して、メッセージを Log ウィンドウ、Kanzi デバッグコンソール、標準出力、およびターゲットデバイスのシステムログに出力します。たとえば、ロギングを使用して Kanzi アプリケーションの問題を見つけたり、アプリケーションのステータスをユーザーに通知したりします。
以下の操作を行うことができます。
Kanzi ロギングマクロを使用してログメッセージを出力します。ログメッセージの印刷 を参照してください。
ログレベルを使用して、重大度に基づいてログメッセージを表示します。ログレベルの設定 を参照してください。
特定の機能に関連する情報を含むログメッセージをグループ化するために、ログカテゴリを使用します。ログカテゴリの使用 を参照してください。
Kanzi のすべてのログメッセージをカスタムロガーを使用してリダイレクトします。カスタムロガーの作成 を参照してください。
ログメッセージの印刷¶
Kanzi ログマクロを使用して、メッセージをログに出力します。ほとんどのログマクロは、メッセージ内の情報の重要度を示すために固定されたログレベルを使用します。ログレベルの設定 を参照してください。
ヒント
ログマクロ呼び出しにアプリケーションの重要なコードを使用しないでください。アプリケーションの重要なコードをログマクロ呼び出しの引数として配置し、コンパイル時にその呼び出し内のメッセージに割り当てられたログレベルまたはログカテゴリを無効にした場合、プリプロセッサはログマクロ呼び出しとともにアプリケーションの重要なコードを削除します。
Kanzi には、次のロギングマクロがあります。
ロギングマクロ |
ディスクリプション (Description) |
|---|---|
デフォルトロガー ( |
|
デフォルトロガー ( |
|
デフォルトロガー ( |
|
デフォルトロガー ( |
|
デフォルトロガー ( |
|
カスタムロガーを使用してログメッセージを記録し、入力パラメータとして提供するログレベルとカテゴリを使用します。カスタムロガーの作成 を参照してください。 |
ログメッセージを印刷するには:
アプリケーションコード内で、ログメッセージを出力したい場所にロギングマクロを使用します。例えば:
デバッグマクロ:
// Print "This is a debug message.". kzLogDebug(("This is a debug message."));
ログに出力します:
info:debug> This is a debug message.
エラーマクロ:
// Print "This is an error message." using the log category MY_LOG_CATEGORY. // Use log categories to group your log messages based on the functionality to which they are related. kzLogError(MY_LOG_CATEGORY, ("This is an error message."));
ログカテゴリの使用 を参照してください。
ファイルへのパス、エラーが発生した行番号、およびエラーメッセージをログに出力します。
error:My category:c:\kanziworkspace\projects\myproject\application\src\myproject.cpp:196> This is an error message.
インフォマクロ:
// Print "1 plus 2 equals 3." using the log category MY_LOG_CATEGORY. kzLogInfo(MY_LOG_CATEGORY, ("{} plus {} equals {}.", 1, 2, 1+2)); int length = 100; // Print "The length is 100.". kzLogInfo(MY_LOG_CATEGORY, ("The length is {}.", length));
ログカテゴリの使用 を参照してください。
ログに出力します:
info:My category> 1 plus 2 equals 3. info:My category> The length is 100.
アプリケーションをビルドして実行します。Kanzi アプリケーションのデプロイ を参照してください。
例えば、Windowsでアプリケーションをビルドする際には、Visual Studioで Debug ビルド構成を使用してください。アプリケーションを実行し、コード内でロギングマクロを呼び出すポイントに到達すると、Kanzi がデバッグコンソールにメッセージを出力します。
コード内でのログメッセージのフォーマット¶
ログメッセージは、スカラー値またはフォーマット引数に続くフォーマット指定文字列のいずれかです。
例:
// Define a log category named "my category".
#define MY_LOG_CATEGORY KZ_LOG_CREATE_CATEGORY(KZ_LOG_ENABLED_CATEGORY, "my category")
// The log message is an integer constant.
kzLogInfo(MY_LOG_CATEGORY, (100));
// Log integer variable.
int length = 100;
// Output: 100
kzLogInfo(MY_LOG_CATEGORY, (length));
// Log a string literal.
// Output: Single log message.
kzLogInfo(MY_LOG_CATEGORY, ("Single log message."));
// Log a formatted message.
// Format string: "{} plus {} equals {}.".
// Format arguments: 1, 2, 1+2.
// Output: 1 plus 2 equals 3.
kzLogInfo(MY_LOG_CATEGORY, ("{} plus {} equals {}.", 1, 2, 1 + 2));
フォーマット指定文字列は、波括弧内にフォーマット引数参照を含むことができるリテラルテキストです。
"Text {...} text {...} ... {...} ..."
ロガーがメッセージを書き込むとき、引数参照を参照された引数の値の文字列表現に置き換え、リテラルテキストの残りの部分は変更しません。これはフォーマット引数参照の構造です:
{[argument index][:format specification]}
フォーマット引数インデックスとフォーマット指定子はオプションです。
注釈
フォーマット指定部分の前にコロンを配置します。
開き中括弧 '{' をフォーマット引数参照として解釈されないようにするには、二重バックスラッシュをプレフィックスとして付けてください: \\{
閉じ括弧 '}' が続く場合、それは削除されず、ログメッセージ出力に残ります。唯一の文字列リテラルはフォーマット文字列とは見なされず、フォーマット引数参照のために解析されません。
例:
// Log message consists of format string and one argument.
// Output: {} { some text }
kzLogInfo(MY_LOG_CATEGORY, ("\\{} \\{ {} } { this text is removed ", "some text"));
// Single string literals are not parsed as log message format string.
// Output: This text is string literal. Braces are kept {}, and { this text remains.
kzLogInfo(MY_LOG_CATEGORY, ("This text is string literal. Braces are kept {}, and { this text remains."));
フォーマット引数インデックスは、引数リスト内のフォーマット引数の位置です。最初のフォーマット引数はインデックス0を持ち、次にインデックス1の引数が続きます。このように続き、最後のフォーマット引数はインデックスN-1を持ちます。ここで、Nはフォーマット引数の総数です。
フォーマット引数リファレンスのフォーマット仕様部分は、参照された引数を文字列に変換する方法を説明しています。これは、参照が引数の文字列表現で置き換えられるときに行われます。詳細については、ログメッセージ引数フォーマット仕様セクションを参照してください。
ログメッセージが書き込まれると、メッセージフォーマット文字列に見つかったフォーマット引数参照は、対応する引数の文字列表現に置き換えられます。
最も単純なケースでは、フォーマット引数は空の中括弧 '{}' で参照されます。
// Format message arguments are referenced one by one using empty braces.
// Output: 1 2 3.
kzLogInfo(MY_LOG_CATEGORY, ("{} {} {}.", 1, 2, 3));
// Output: 1 plus 2 equals 3.
kzLogInfo(MY_LOG_CATEGORY, ("{} plus {} equals {}.", 1, 2, 1 + 2));
引数インデックスを明示的に使用して、フォーマット引数を参照することもできます:
// Log values in custom order.
// Output: 3 1 2 3 5.
kzLogInfo(MY_LOG_CATEGORY, ("{2} {0} {1} {2} {4}.", 1, 2, 3, 4, 5));
// Log values in custom order using implicit argument indexing.
// Note: The argument reference '{1}' followed by '{}'.
// Output: argument #4 = 5, argument #0 = 1, argument #2 = 3, argument #3 = 4, argument #4 = 5.
kzLogInfo(MY_LOG_CATEGORY, ("argument #4 = {4}, argument #0 = {0}, argument #2 = {2}, argument #3 = {}, argument #4 = {}.", 1, 2, 3, 4, 5));
最後の例では、インデックス付きの引数参照 '{2}' の後にインデックスなしの引数参照 '{}' が続いていることがわかります。このような場合、インデックスなしで参照される引数は、インデックス付きで参照される引数(この場合は#2)の次の引数(この場合は#3)です。
ログメッセージ引数フォーマット仕様¶
ログメッセージフォーマット引数のリファレンスは、引数インデックスとフォーマット指定から構成されます。フォーマット指定は、ログメッセージフォーマット引数の値がどのように文字列に変換され、メッセージがログに書き込まれる際にどのように配置されるかを記述します。ロギングシステムは、値をテキスト表現に変換する際にフォーマット引数の値の型を考慮し、ロギングを型安全にします。
フォーマット仕様は次の構造を持っています:
[align][sign][#][0][width][.precision][specifier]
アラインフォーマット引数は、結果のテキストの位置を設定します。アラインの利用可能な値:
Align value |
出力 |
|---|---|
|
利用可能なスペース内で左揃えされたテキスト。 |
|
テキストは利用可能なスペース内で右に揃えられます。これはデフォルトの設定です。 |
符号は数値型にのみ有効です。符号の利用可能な値:
符号値 |
出力 |
|---|---|
|
正の数と負の数の両方の符号。 |
|
負の数の符号です。これはデフォルトの設定です。 |
スペース (space) |
正の数にはスペースを、負の数にはマイナス記号を付けます。 |
# フォーマット引数は、整数型の8進数または16進数指定子に対して有効です。存在する場合、出力は o 指定子の場合は '0'、x/X 指定子の場合は '0x'/'0X' が接頭辞として付きます。
0 フォーマット引数は、値が文字列に変換されたときに width よりも少ない文字数を消費する場合、スペースの代わりに左側にゼロを埋めます。
width フォーマット引数は、出力テキストの最小幅を示す整数です。テキストが全幅を消費しない場合、残りのスペースはスペースで埋められます。また、0 フォーマット引数が指定されている場合は、ゼロで埋められます。
precision フォーマット引数は浮動小数点型にのみ有効で、小数点以下に表示する桁数を示します。
precision フォーマット引数は、フォーマット引数の値を文字列に変換する際に使用する表記を示します。利用可能な specifier の値は、フォーマット引数のタイプに依存します。この表は、specifier に利用可能な値を一覧にしています。
スペシファイア |
出力 |
|---|---|
キャラクター |
|
|
単一文字。これは符号付き文字のデフォルトです。 |
|
10進数の数。 |
|
符号なしの10進数。これは符号なし文字のデフォルトです。 |
|
8進数の数。 |
|
小文字の a - f を使用した基数16の数。 |
|
基数16の数値は、A - Fの大文字を使用します。 |
Integer |
|
|
10進数の数値です。これは符号付き整数のデフォルトです。 |
|
符号なしの10進数。これは符号なし整数のデフォルトです。 |
|
8進数の数。 |
|
小文字の a - f を使用した基数 16 の数値。 |
|
基数16の数値は、大文字のA - Fを使用します。 |
浮動小数点 |
|
|
科学表記法の数値です。文字「e」は指数部を示します。 |
|
科学表記法の数値。文字「E」は指数部を示します。 |
|
小文字の10進浮動小数点表記の数値です。これは浮動小数点数のデフォルトです。 |
|
10進浮動小数点表記の数値、大文字。 |
|
最も短い表現での数値: 'e' または 'f'。 |
|
最も短い表現での数値: 'E' または 'F'。 |
|
16進浮動小数点表記の数値、小文字。 |
|
16進浮動小数点表記の数値、大文字。 |
|
'a' と同じです。 |
|
「A」と同じです。 |
ポインタ (Pointer) |
|
|
ポインタアドレス。これはポインタのデフォルトです。 |
注釈
引数の型が指定子フィールドと一致しない場合、引数の型に対するデフォルトの指定子が使用され、引数の値が文字列に変換されます。
フォーマットアーギュメントの型がポインターの場合、Logging サブシステムはポインターに格納されているアドレスをログに書き込みます。フォーマットアーギュメントの型が配列 (T[]) の場合、Logging サブシステムはその配列の最初の要素のアドレスをログに書き込みます。テキストとしてログに書き込まれるのは、const char[] 型または char[] 型の文字列リテラルのみです。
const char* または char* ポインタが指す文字列をログに書き込むには、string_view オブジェクトを使用できます。ログに記録したい文字列へのポインタで string_view オブジェクトを初期化し、そのオブジェクトをログフォーマットの引数として使用します。文字列へのポインタをフォーマット引数として渡すと、その文字列のアドレスのみがログに書き込まれます。
ユーザー定義型のオブジェクトをログフォーマットの引数として使用できます。ロギングサブシステムは、ユーザー定義型のオブジェクトを文字列に変換するために logArgumentToString テンプレート関数を使用します。ユーザー定義型には、align フォーマット引数のみが適用されます。ロギングサブシステムは、いくつかのユーザー定義型に対して logArgumentToString を特殊化しています。
例¶
さまざまな引数指定子を使用してメッセージをログに記録するには:
// Log the value of 10 in different base systems.
// Output: decimal: 10, octal: 012, hexadecimal: 0xa.
kzLogInfo(MY_LOG_CATEGORY, ("decimal: {}, octal: {:#o}, hexadecimal: {:#x}.", 10, 10, 10));
// Using argument index could be shortened to:
// added in resulting text to octal or hexadecimal presentation.
// Output: decimal: 10, octal: 012, hexadecimal: 0xa.
kzLogInfo(MY_LOG_CATEGORY, ("decimal: {}, octal: {0:#o}, hexadecimal: {0:#x}.", 10));
// Field width is 4 characters.
// Output: decimal: 10.
kzLogInfo(MY_LOG_CATEGORY, ("decimal:{:4}.", 10));
// Field width is 4 characters, left aligned.
// Output: decimal:10 .
kzLogInfo(MY_LOG_CATEGORY, ("decimal:{:<4}.", 10));
// Field width is 4 characters, zero filled.
// Output: decimal:0010.
kzLogInfo(MY_LOG_CATEGORY, ("decimal:{:04}.", 10));
// Field width is 4 characters, with sign and left aligned.
// Output: decimal:+10 .
kzLogInfo(MY_LOG_CATEGORY, ("decimal:{:<+4}.", 10));
文字列フォーマット引数を使用するには:
const char* message = "Hello world!!!";
// Write message to the log:
// Output: Message: Hello World!!!
kzLogInfo(MY_LOG_CATEGORY, ("Message: {}", string_view(message)));
// Write string literal to the log:
// Output: Message: String literal message.
kzLogInfo(MY_LOG_CATEGORY, ("Message: {}", "String literal message."));
ログレベルの設定¶
ログレベルを使用して、重大度に基づいてログメッセージを表示します。たとえば、アプリケーション実行中の重大な問題を記録するには、error ログレベル (log_level.hpp::KZ_LOG_LEVEL_ERROR) を使用します。
Kanzi ロギングシステムには、次のログレベルがあります。
ログレベル |
ネーム (Name) |
重大度 |
ディスクリプション (Description) |
|---|---|---|---|
|
1 |
重大な故障メッセージをログに記録します。問題に関する十分な情報を受け取れるように、詳細なエラーメッセージを作成してください。 |
|
|
2 |
注目が必要な事実を記録しますが、必ずしも不具合ではありません。例えば、アプリケーションが回復可能な結果についてユーザーに通知するために警告メッセージを使用します。これは、デフォルト値を持つ欠落したパラメータや、失敗ではないがパフォーマンスの低下につながる可能性のあるイベントなどです。 |
|
|
3 |
システムで何が起こっているかの概要を示す情報をログに記録し、通過したログの状態、設定に関する静的情報などを記録します。 |
|
|
4 |
システムに関する最大限の情報をログに記録します。これは最も詳細なログレベルです。このレベルを使用して問題をトラブルシュートします。 |
これらのログレベルはデフォルトで有効になっています:
ログレベルを設定するには、log_level.hpp::KZ_LOG_LEVEL_ENABLED_THRESHOLD マクロを使用します。
例えば、すべてのログレベルを有効にするログレベルを設定するには、
#define KZ_LOG_LEVEL_ENABLED_THRESHOLD KZ_LOG_LEVEL_TRACE
独自のログレベルを作成できます。LogLevelMacros::KZ_LOG_CREATE_LEVEL を参照してください。
ログカテゴリの使用¶
ログカテゴリを使用して、特定の機能に関連する情報を含むログメッセージをグループ化します。
Kanzi ロギングシステムには、デフォルトで次のログカテゴリがあります。
ログカテゴリ |
ディスクリプション (Description) |
|---|---|
デバッグメッセージを収集します。 |
|
グラフィックメッシュログメッセージを収集します。 |
|
EGLログメッセージを収集します。 |
|
他のログカテゴリに割り当てていないログメッセージを収集します。ログメッセージは常に明示的にログカテゴリのいずれかに割り当てるか、新しいログカテゴリを作成することをお勧めします。 |
ログカテゴリを作成して使用するには、
LogCategoryMacros::KZ_LOG_CREATE_CATEGORYマクロを使用してログカテゴリーを作成します。// Create a log category named "My category" and set the state of the category to enabled. // The Kanzi logging system uses category state to filter log messages. // To disable a log category, use the KZ_LOG_DISABLED_CATEGORY. #define MY_LOG_CATEGORY KZ_LOG_CREATE_CATEGORY(KZ_LOG_ENABLED_CATEGORY, "My category")
作成したログカテゴリにログメッセージを出力します。
// Print to the log "This is an info message." using the MY_LOG_CATEGORY log category. kzLogInfo(MY_LOG_CATEGORY, ("This is an info message."));
アプリケーションをビルドして実行するか、Kanzi Studio Preview でアプリケーションと対話します。アプリケーションがログメッセージを作成したコードに到達すると、Kanzi がデバッグコンソールまたは Kanzi Studio Log ウィンドウにメッセージを出力します。
info:My category> This is an info message.
カスタムロガーの作成¶
ログメッセージをリダイレクトするには、AbstractLogger を継承するカスタムロガークラスを実装し、カスタムロガーを Kanzi ロギングシステムにプッシュします。ロガークラスが AbstractLogger::writeOverride 関数をオーバーライドするようにしてください。
カスタムロガーを使用してログメッセージを書くには、log.hpp::kzLog マクロを使用します。
アプリケーションのすべてのログメッセージを書き込むためにカスタムロガーを使用したい場合は、デフォルトロガー (DefaultLogger) にロガーを登録してください。デフォルトロガーは AbstractLogger から継承されており、すべてのログメッセージが通過するロガーのチェーンを含んでいます。これらのロガーはデフォルトでデフォルトロガーに登録されています。
デフォルトロガー |
ログメッセージの送信先 |
|---|---|
標準出力 |
|
Androidシステムログ |
|
Kanzi デバッグコンソール on Windows |
ロガーを実装するには:
// Use this logger to store log messages in a container for later retrieval.
//
// This class inherits from kanzi::AbstractLogger and implements the writeOverride() function. It stores logs in the container.
// To retrieve the logs, use the get() function.
class SimpleLogger : public AbstractLogger
{
public:
// Kanzi calls this function to write messages to the log.
//
// This function stores the log message in a container. To retrieve all log messages, use the get() function.
// Each log message includes:
// - The message text
// - The log level
// - The log category
// - If the message is an error, the file name and the line number where the error occured
//
// \param level The log level of the message.
// \param levelName The string representation of the log level.
// \param categoryName The string representation of the log category.
// \param fileName The name of the file in which the message originated.
// \param lineNumber The number of the line on which the message originated.
// \param message The message.
void writeOverride(LogLevel level, string_view levelName, string_view categoryName,
string_view fileName, size_t lineNumber, string_view message) override
{
// Start the log with the level name.
string logMessage(levelName);
// Separate the log level and the log category with a colon.
logMessage += ':';
// Add the category name.
logMessage.append(categoryName.data(), categoryName.length());
if (level == LogLevelError)
{
// The error is reported.
// To show where in the code the error was reported, add the file name and the line number to the message.
logMessage.append(fileName.data(), fileName.length());
// Separate the file name and the line number with a colon.
logMessage += ':';
logMessage += to_string(lineNumber);
}
// Add an angle bracket and the message text.
logMessage += "> ";
logMessage.append(message.data(), message.length());
// Append the log message to the log vector.
m_log.push_back(logMessage);
}
// Get log vector reference.
vector<string>& getLog()
{
return m_log;
}
private:
// Log vector.
vector<string> m_log;
};
ロガーを明示的に使用するには:
// SimpleLogger inherits from kanzi::AbstractLogger and implements writeOverride.
SimpleLogger simpleLogger;
// Write a log message using SimpleLogger.
kzLog(simpleLogger, KZ_LOG_LEVEL_INFO, KZ_LOG_CATEGORY_GENERIC, ("Lets log 1 + 2 = {}.", 1 + 2));
ロガーチェーンでロガーを使用するには:
// SimpleLogger inherits from kanzi::AbstractLogger and implements writeOverride.
AbstractLoggerUniquePtr simpleLogger(new SimpleLogger());
// Before adding SimpleLogger to the logger chain, get the pointer to it.
// After you add SimpleLogger to the logger chain, the logger chain controls the lifetime of SimpleLogger.
SimpleLogger* simpleLoggerPtr = static_cast<SimpleLogger*>(simpleLogger.get());
// Push SimpleLogger to the logger chain. Now both SimpleLogger and the rest of the loggers handle every logged message.
DefaultLogger::pushLogger(kanzi::move(simpleLogger));
// Write a log message. SimpleLogger handles this message.
kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Lets log 1 + 2 = {}.", 1 + 2));
ログメッセージを専用のロガーにリダイレクトするには、
// SimpleLogger inherits from kanzi::AbstractLogger and implements writeOverride.
AbstractLoggerUniquePtr simpleLogger(new SimpleLogger());
// Before adding SimpleLogger to the logger chain, get the pointer to it.
// After you add SimpleLogger to the logger chain, the logger chain controls the lifetime of SimpleLogger.
SimpleLogger* simpleLoggerPtr = static_cast<SimpleLogger*>(simpleLogger.get());
// Remove all default loggers from the logger chain. This way you make only SimpleLogger, which you push to the chain later, handle the logged messages.
DefaultLogger::popAllLoggers();
// Push SimpleLogger to the logger chain. Now only SimpleLogger handles every logged message.
DefaultLogger::pushLogger(kanzi::move(simpleLogger));
// Write a log message. SimpleLogger handles this message.
kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Lets log 1 + 2 = {}.", 1 + 2));
QNXシステムロガー (slogger2)¶
QNXでは、QNXシステムロガー (slogger2) を使用してログメッセージを書くことができます。ログメッセージをslogger2にリダイレクトすると、Kanzi アプリケーションはデフォルトのロガーにログメッセージを書き続けます。
デフォルトで、QNXはslogger2ログを /tmp/slogger2/<Kanzi-application-name>.<process-id> に書き込みます。
Kanzi が Kanzi アプリケーションの設定を読み込んだ後にslogger2が初期化されることに注意してください。このため、それ以前のログメッセージはslogger2のログに含まれません。
Kanzi アプリケーションで slogger2 を設定する方法を学ぶには、QNXシステムロガー (slogger2) を参照してください。
slogger2ログファイルを表示する¶
QNXデバイスでslogger2ログファイルを表示するには、次を実行します。
slog2info -l <log-filename>
カスタムslogger2バッファの登録¶
Kanzi は、カスタムのslogger2バッファを登録し、それを Kanzi アプリケーションに渡すことを可能にします。次に、Kanzi アプリケーションはそのバッファを使用してログを書き込みます。例えば、バッファにカスタム名を付けたい場合や、slog2_register に渡される slog2_buffer_set_config_t 構造体からプロパティを設定したい場合に、カスタムのslogger2バッファを登録することができます。
slogger2バッファを登録すると、slogger2は application.cfg または Application::onConfigure で設定した他のすべてのQNXロガー構成パラメータを無視します。
-1 と null は、slogger2 バッファ名として有効な値ではないことに注意してください。
カスタムslogger2バッファを登録するには、Application::onConfigure で次を設定します。
configuration.slog2Config.customSlog2Buffer = value
value は slog2_buffer_t タイプのバッファです。デフォルト値は nullptr(無効)です。
例えば、カスタムのslogger2バッファを次のように登録できます。
// Register one slog2_buffer_t buffer.
vector<slog2_buffer_t> buffers = vector<slog2_buffer_t>(1);
slog2_buffer_set_config_t buffersetConfig{ 1, "MyBufferset", SLOG2_INFO, {{ "MyBuffer", 16 }}, UINT32_MAX };
if (slog2_register(&buffersetConfig, buffers.data(), 0) != 0)
{
// Handle the error.
}
// Pass the registered buffer to the application.
configuration.slog2Config.enabled = true;
configuration.slog2Config.customSlog2Buffer = buffers[0];
slogger2の後処理を行う¶
Kanzi アプリケーションが終了すると、デフォルトで、slogger2 は slog2_reset を呼び出します。これにより、Kanzi によって登録されたものだけでなく、Kanzi プロセスによって登録されたすべての slogger2 バッファが解放されます。この動作は、Application::uninitializePlatform をオーバーライドすることで変更できます。たとえば、Kanzi アプリケーションが終了した後に slog2_reset を呼び出したい場合に、この動作を変更します。
class MyApplication : public Application
{
...
public:
...
// Override the uninitializePlatform method to prevent calling slog2_reset.
void uninitializePlatform() final
{
...
}
}
関連項目¶
Kanzi Engine のパフォーマンスプロファイリングデータをログに記録する
アプリケーションコードのパフォーマンスプロファイリングデータをログに記録する