boost::log
C++ プログラムのロガーとして使用しています。開発中は、次のようによく使用します。
#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity))
#define LOG_ERR LOG(Severity::error)
#define LOG_INFO LOG(Severity::info)
#define LOG_DEBUG LOG(Severity::debug)
BOOST_LOG_SEV
は によって提供される機能でboost::log
ありLOG
、LOG_ERROR
、LOG_INFO
、LOG_DEBUG
は私が定義したショートカットです。
つまりBOOST_LOG_SEV
、現在のデバッグの重大度とマクロ自体に渡された重大度を動的に比較して、出力を発行するかどうかを決定します。
これは、デバッグ目的で上記のマクロを使用するプログラムの例です。
// set at compile time
#define MAX_LOG_SEVERITY Severity::debug
int main() {
// Print all the messages with a
// Severity <= MAX_LOG_SEVERITY defined before compiling
boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea
// bool err = ...
if (err)
LOG_ERR << "An error occurred";
else
LOG_INFO << "Okay;
LOG_DEBUG << "main() called";
}
現在、実稼働環境用にプログラムをリリースする場合、Severity::debug
レベル付きのデバッグ メッセージはあまり意味がありません。に減らすだけでそれらを出力から隠すことができますMAX_LOG_SEVERITY
がSeverity::info
、問題は、によって行われた呼び出しがLOG_DEBUG
実行可能コードから削除されないことです。これは、効率とオブジェクト サイズの両方に悪影響を及ぼします。
コードはロギング ステートメントでいっぱいです。単純なoperator<<()
.
LOG_DEBUG
これらのステートメント自体に触れずに、プリプロセッサまたはコンパイラ (最適化中に)が定数MAX_LOG_SEVERITY
に設定されているときにデバッグステートメントを「スキップ」または「削除」するためのより良いマクロ定義/トリックはありますか?Severity::debug