5

私はC++でログハンドラーを実装していますが、それは問題なく機能しますが、使用できるものが1つあり、それがロガーが出力を取得する場所です。

これはそれほど大きな問題ではないと思いますが、__func__基本的に現在の関数の関数名を保持する識別子に出くわしました。

したがって、Logクラスにと呼ばれる静的関数がWriteあります。これはログレベルと変数リストを取ります。だから私はそれをそのように呼ぶでしょう:

Log::Write(LOG_DEBUG, "this is an integer: %d", 10);

そしてそれは印刷されます:

2013-01-02 => 10:12:01.366 [DEBUG]: this is an integer: 10

ただし、次のようなものを作成するには、メッセージに発信者も含めると便利だと思っていました。

2013... => 10:12:... (functionName) [DEBUG]: blah

だから私ができることは(もちろん)に__func__パラメータとしてを追加するLog::Writeことですが、それは私が呼び出すときはいつLog::Writeでも送信する必要があることを意味します__func__これは常に同じであり、それなしでそれを行うことができるはずだと感じています明示的にそう言っています。

だから私が欲しいのは、以下で提供される機能です。

Log::Write(LOG_DEBUG, __func__, "message");

毎回明示的にfuncを入力する必要はありません。

これが本当に可能かどうかはわかりませんが、私が得た最善の策は、関数内で呼び出し元を逆参照する方法があることWriteです。そのようなパラメーターを「推測」できる可能性は低いようです。 。しかし、少なくとも尋ねる価値があり、多分私はどんなオプションがあるかを見ることができます。

ありがとう。

4

2 に答える 2

8

__FILE__これは通常、ファイル名と行番号とともにマクロを使用して行われます__LINE__

void Log::Write(Level l,
                char const* function,
                char const* file,
                int line,
                char const* format,
                ...);

マクロにラップされます:

#define LOG(Level_, Format_, ...) \
    Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);

そのレベルでログを記録するかどうかをチェックすることで、コンピューティングを「節約」したい場合があることに注意してください。

// suppose availability of "bool Log::Enabled(Level l)"
#define LOG(Level_, Format_, ...)   \
    while (Log::Enabled(Level_)) {  \
      Log::Write(Level_, __func__, __FILE__, __LINE__, Format_, __VA_ARGS__);  \
      break;  \
    }

whileの代わりにの使用はif、ぶら下がっているelseの問題を回避することです。

注:ロギングのためのストリームの使用を調査することをお勧めします。スタイルの問題printfは、それが構成可能ではないということです。ストリームを使用するとstd::ostream& operator<<(std::ostream&, X const&)、任意のコンテンツをオーバーロードしてから、そのコンテンツをログにダンプするメソッドを1回Xだけ書き込むことができます。

于 2013-01-02T09:32:05.607 に答える
3
#define WRITE_LOG(X,...) Log::Write(LOG_DEBUG, __func__, (X),__VA_ARGS__);

関数の代わりにこのマクロを使用してログを書き込むと、funcパラメーターが自動的に追加されます。マットが述べているように、これは典型的な方法です。この場合、マクロを回避する方法は考えられません。

于 2013-01-02T09:27:00.410 に答える