\base\logging.h
https://cs.chromium.org/chromium/src/base/logging.h
CHECKマクロ
デバッグモードとリリースモードの両方で動く。CHECKが失敗したときはLOG(FATAL)が実行され、クラッシュダンプが作成されプロセスが強制終了される(デバッガがいないとき)。
VLOG
Vervoseレベルを指定したログ。起動時に--v=2とした場合、VLOG(2)がロギングされる。
VLOG(2) << "I'm printed when you run the program with --v=2 or more";
オプションのメッセージ能力
Assertionの失敗メッセージや致命エラーはアプリが終了する前にダイアログボックスで表示される。しかしこのUIはメッセージループを作成し、それによりメッセージが処理され、生存しているウインドウにメッセージが配信されるかもしれない。アサートダイアログが表示されているときはアプリケーションは悪い状態にあるので、これらのメッセージは処理されずにダイアログが固まるかもしれないしアプリが暴走するかもしれない。
それゆえに、エラーダイアログは別プロセスで表示したほうが良い。ロギングシステムが致命エラーダイアログを表示するとき、実行ファイルと同じディレクトリから"DebugMessage.exe"を探すし、コマンドラインにメッセージを渡して起動する。パースを簡単にするためにアプリ名は含まれない。
DebugMessage.exeのコードは1行で、WinMainで以下を行う。
MessageBox(NULL, GetCommandLineW(), L"Fatal Error", 0);
もしDebugMessage.exeが見つからなければ、ロギングコードは通常のMessageBoxを表示する。これは上述のような問題を起こすかもしれない。
手順
ログのための多くのマクロ。ログを取るにはLOG(<ある重要度レベル>)にストリームを流し込む。例えば以下:
LOG(INFO) << "Found " << num_cookies << " cookies";
条件ログもできる:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
CHECK(condition)マクロはデバッグビルドとリリースビルドで有効で、デバッガが存在しないときはLOG(FATAL)を実行し、これはプロセスを強制終了し、クラッシュダンプを作成する。
デバッグモードのログマクロもある。上記のやつと似ている:
DLOG(INFO) << "Found cookies"; DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
すべてのデバッグモードログは非デバッグモードでは消えてなくなる。LOG_IFと開発フラグは同時に使える。なぜならコードはcan be compiled away sometimes.
以下のマクロもある。
LOG_ASSERT(assertion); DLOG_ASSERT(assertion);
これは {,D}LOG_IF(FATAL, assert fails) << assertion
の糖衣構文である。
「冗長レベル」のロギングマクロもある。以下のようなもの:
VLOG(1) << "I'm printed when you run the program with --v=1 or more"; VLOG(2) << "I'm printed when you run the program with --v=2 or more";
これらはINFOログレベルでログをとる。 冗長ログはモジュールごとに有効にすることもできる。例えば以下:
--vmodule=profile=2,icon_loader=1,browser_*=3,*/chromeos/*=4 --v=0
これは以下をもたらす。
- a.
VLOG(2)
とより低いメッセージはprofile.{h,cc}
から取られる。 - b.
VLOG(1)
とより低いメッセージは@@icon_loader.{h,cc}から取られる。 - c.
VLOG(3)
とより低いメッセージはプリフィクスbrowser
から取られる。 - d.
VLOG(4)
とより低いメッセージはchromeosディレクトリから取られる。 - e.
VLOG(0)
とより低いメッセージはどこからでも取られる。
// The wildcarding functionality shown by (c) supports both '*' (match // 0 or more characters) and '?' (match any single character) // wildcards. Any pattern containing a forward or backward slash will // be tested against the whole pathname and not just the module. // E.g., "*/foo/bar/*=2" would change the logging level for all code // in source files under a "foo/bar" directory. // // There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as // // if (VLOG_IS_ON(2)) { // // do some logging preparation and logging // // that can't be accomplished with just VLOG(2) << ...; // } // // There is also a VLOG_IF "verbose level" condition macro for sample // cases, when some extra computation and preparation for logs is not // needed. // // VLOG_IF(1, (size > 1024)) // << "I'm printed when size is more than 1024 and when you run the " // "program with --v=1 or more"; // // We also override the standard 'assert' to use 'DLOG_ASSERT'. // // Lastly, there is: // // PLOG(ERROR) << "Couldn't do foo"; // DPLOG(ERROR) << "Couldn't do foo"; // PLOG_IF(ERROR, cond) << "Couldn't do foo"; // DPLOG_IF(ERROR, cond) << "Couldn't do foo"; // PCHECK(condition) << "Couldn't do foo"; // DPCHECK(condition) << "Couldn't do foo"; // // which append the last system error to the message in string form (taken from // GetLastError() on Windows and errno on POSIX). // // The supported severity levels for macros that allow you to specify one // are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL. // // Very important: logging a message at the FATAL severity level causes // the program to terminate (after the message is logged). // // There is the special severity of DFATAL, which logs FATAL in debug mode, // ERROR in normal mode.