2012-01-05 8 views
1

私のアプリケーション用のログツールがあります。私は階層的な方法でXMLにログします(これはログ項目を入れ子にすることを意味します)。私のLog(string, bool)は、2つのパラメータをとります.1つはログする文字列と、このコメントが前のログコメントの下にネストされるべきかどうかを判断するブール値です。 PopLog()メソッドが親に移動し、親レベルでログ記録を続行します。ログクラスを改善するには

これは私がこのようにログインしたときにことを意味します

Log("first", false); 
... 
Log("Second", true); 
... 
Log("Third", true); 
PopLog(); 
PopLog(); 
PopLog(); 

これは、次のような結果得られます。

<first> 
    <second> 
    <third> 
    </second> 
</first> 

を、私は、現在のデザインを持っている問題は、私を追跡するのは難しいですログレベル、ログツリーの深さ、およびポップするか、trueを使用してログを記録するか、またはfalseを使用してログを記録する必要があるかどうかを指定します。

これを簡単にし、メンテナンス性を高め、より良いものにするための良いアイデア(ログプロバイダの変更はオプションではありません)?

+3

をあなたはlog4netのかのlog4jを使用していないのはなぜ? –

答えて

0

プッシュ/ポップの動作とロギング自体を分離するために、IMOが優れています。ここでIDisposableを使用して、C#でのソリューションです:

class IndentedLog : IDisposable 
{ 
    public IndentedLog() 
    { 
     Log.IndentLevel++; 
    } 
    public void Dispose() 
    { 
     Log.IndentLevel--; 
    } 
} 

このように、あなたのような何かを行うことができます。

 Log("first"); 
    // ... 
    using (new IndentedLog()) 
    { 
     Log("second"); 
     // ... 
     using (new IndentedLog()) 
     { 
      Log("third"); 
     } 
    } 
2

私は可読性のためにを追加しますAddLog()の可能性は子供のようです。フォア例:

Log("first").Log("second").Log("third")

これは基本的にlog()content log型を返す必要があることを意味します。

希望は明らかでしたが、モバイルから書いてみましたので、具体的なコード例を書くことは混乱ですが、ヒントを与えるだけです。

Log("first", "/first"); 
Log("Second", "/first/second"); 
0

はたぶん、あなたはbool値の代わりにXPath式を追加することができます。それ以外の場合は、実行終了時にすべてのオープンタグを閉じるCloseAllTags()を呼び出す必要があります。開いているタグがない場合、PopLog()は何もしないでください。 この方法では、ネストレベルを監視する必要はありません。

0

私はPopLog()はオプションとあなたが1つのレベル上に行く必要が知っているときだけ呼び出されるべきであると言うだろう

0

ログクラス内では、3つのプロパティーを持つことができます。 1.すべてのインスタンスに固有のID。 2. Levelは、ログの深さを表すint型です。 3.親、それはxmlの1つ上のレベルであるログのIDになります。

次に、上記のプロパティを使用してログの場所と深さを特定する方法を記述できます。