1

Loggerpublic メソッドを持つ静的 C++ クラスがあります。

static std::ostringstream& Log(int sev);

ご覧のとおり、メソッドは ostringstream として評価されるため、次のように入力するだけでログを記録できます。

Logger::log(MY_SEVERITY) << "hello world";

コンパイラは最初に log(MY_SEVERITY) を評価し、次に式全体を評価するため、2 番目の方法が必要です。

static FVResult_t Flush();

実際に ostringstream の内容をディスクに書き込みます。Flush() は Log() 呼び出しの直前に呼び出す必要があるため、何かをログに記録したいときはいつでも、2 つのメソッドを順番に呼び出す必要があります。

Logger::log(MY_SEVERITY) << "hello world";
Logger::Flush();

ここまでは順調ですね。

私の質問は、次のようなことを可能にする 2 つのメソッドを組み込んだ C++ マクロを書きたいということです。

LOGMACRO(MY_SEVERITY) << "hello world";

私は試しました:

#define LOGMACRO(lev) \
Logger::Log(lev) \
Logger::Flush();

ただし、予想どおり、C++ コンパイラは ostringstream の欠落について不平を言います。このような ostringstream をマクロでのみ Logger::Log(lev) に渡す方法は?

4

3 に答える 3

3

次のマクロのみを使用できます

#define LOGMACRO(lev, msg) \
Logger::Log(lev) << msg; \
Logger::Flush();

のように使う

LOGMACRO(MY_SEVERITY, "hello world")

ただし、その機能、または手動で使用std::endlするか、独自のマニピュレーターを使用する方が良いと思います。

関数は次のようになります

inline void log(int severity, const std::string& msg)
{
   Logger::Log(severity) << msg;
   Logger::Flush();
}

その後

log(MY_SEVERITY, "Hello!");
于 2013-04-12T08:23:08.373 に答える
1

問題は、「Hello world」がロガーにストリーミングされる前にマクロが展開され、次のようになることです。

Logger::Log(MY_SEVERITY)
Logger::flush();
<< "hello world"

これは有効な C++ ではありません。

最善の方法は、次のようなマクロを使用することです。

#define LOG_ERROR( msg ) \
do { \
    std::ostringstream oss; \
    oss << __func__ << "() ERROR: " << msg; \
    Logger::Log( LEVEL_ERROR ) << oss.str(); \
    Logger::Flush(); \
} while(0)

このマクロは次のように使用できます。

void foo()
{
    /// stuff that detects a error
    LOG_ERROR( "Parameter X has an invalid value " << std::hex << x 
               << " should be in the range " << y " - " z" );
}

これは、次の行に沿って何かを出力します

foo() : Parameter X has an invalid value F7  should be in the range 0 - F0

std::hexこのメカニズムは、マクロの呼び出しポイントなどでストリーム出力指定子をリセットすることについて心配する必要がないことも意味しますLOG_ERROR

あるいは、調査する価値があるかもしれませんboost::log

于 2013-04-12T08:39:00.907 に答える