2012-02-01 21 views
0

多分/ほとんどすべての良いフレームワークがそれを行うことができますが、私はロガークラス/フレームワークを(できるだけ単純な)探しています。はそれを簡単にしますネストされたログ出力、ネストされた/フォーマットされたロギング

[time] A::doSomething start 
[time] doing this 
[time] doing that 
[time] calling B 
[time] B::somethingElse start 
[time]  do 
[time]  re 
[time]  mi 
[time]  c::foo start 
[time]  ... 
[time]  c::foo end 
[time] B::somethingElse end 
[time] A::doSomething end 

のようなものは、私はinterwebsを検索中に来て最も近いnested diagnostic contexts in log4jです。しかし、これはjavaのためであり、b)私はこれが私が探しているものを提供するかどうかわかりません...

そして、ドキュメントに「コンテキストを残すときはNDC.pop」があります。可能であれば、スタックベースの魔法をもっと使いたいです。

私が探していることができるプロジェクトはありますか?

TIA

+0

デバッグ定義に基づいてコールを入れるマクロを持つシンプルシングルトンクラスがあります。作成する必要がある場合は最も簡単に作成できます。それ以外の場合は、プロジェクトが既に行っていることを実行します。 –

+0

"プロジェクト"は現在、ベーシックなシンプルなロガークラスを使用しています。私は不明瞭なフロー制御と複数の出口点を持つ多くの関数/メソッド、純粋にフィルタリングされていないスパゲティコードを持つコードを継承しました。そして、今私は、少なくとも何が起こっているのかを知るために、新しいロギングコードでコードを焼き付けるのに必死です。( –

+0

@AdrianAlbrecht:メソッドの複数の終了点には何も問題はありません...しかし、通常は悪い:) –

答えて

0

私はロギング用の任意のフレームワークを知らないが、私はそれは本当に難しいことではありません知っている十分なプリティプリンタでプレイしました。

class LogNester: private boost::noncopyable { 
public: 
    LogNester(Logger& l): logger(l) { logger.push(); } 
    ~LogNester() { logger.pop(); } 

private: 
    Logger& logger; 
}; 

使用法:

void foo() { 
    LogNester _(GlobalLogger); 

    // do something 
} 

1つの重要なポイント:あなたが名前に変数を必要とするpushpop操作をサポートしLoggerクラスの存在を仮定すると

LogNester(GlobalLogger)は、このステートメント(oups)のみを押してポップしますが、名前付き変数はスコープの終わりまで有効です。

あなたは(私が理解できた)新しい名前で毎回来るの疲れている場合は、いつでもマクロに頼ることができます。

#define NESTLOG() LogNester BOOST_PP_CAT(log, __LINE__)(GlobalLogger); 

はまだ、それは正確に...あなたのように自動化されていません各メソッドの入力時にLogNesterオブジェクトを定義する必要があります。理論的には、スタックコール情報を使用して、少し遅く気にしない限り、魔法のように深さを得ることができるはずです。 gccでは、これはbacktraceユーティリティを使用して行われます:呼び出しがインライン化されているかどうか、これは非常に依存し、もちろん

#define LOG(Message_) \ 
    do { \ 
    GlobalLogger.log(__FILE__, __LINE__, __FUNCTION__, depth(), Message_); \ 
    } while(0) 

#include <execinfo.h> // GNU/Linux specific header 

inline unsigned depth() { 
    void* Stack[64]; 
    return backtrace(Stack, sizeof(Stack)); 
} 

次に、あなたのログマクロを強化します。

私は個人的には__FILE____LINE____FUNCTION__で十分でした。