7

次のように静的クラス内でロガーへの参照を取得しているlog4netを使用しています。

internal static class Constants
{
   public static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
}

アプリ全体でその参照を次のように使用します。

Constants.Log.Info(_message);

ただし、これが問題を引き起こす可能性があると感じており、定数 (グローバル?) 変数が悪いことになる可能性があることを認識しています。

  • この方法に何か問題はありますか?
  • 理由は何ですか?
  • これらを解決するにはどうすればよいでしょうか?
4

2 に答える 2

13

ログ レベルを簡単に区別し、クラスごとに異なるログ ターゲット (「アペンダー」) を使用できるようにしたい場合、それは最善の方法ではありません

通常、各クラスには、ILog完全修飾型にちなんで名付けられた静的インスタンスを含めることをお勧めします。

namespace Animals
{
   public class Dog
   {
       private static readonly ILog Log = LogManager.GetLogger(typeof(Dog));
   }

   public class Cat
   {
       private static readonly ILog Log = LogManager.GetLogger(typeof(Cat));
   }
}

これはシングルトンに比べて手間がかかるように見えますが、長期的には非常に便利です。これを行うと、構成ファイルを介してレベルを区別Dogしてログに記録するのは簡単です ( log4net構文で示されている例)。Cat

<log4net>

   <!-- appender definitions ommited -->

   <!-- default for all loggers in Animals namespace -->
   <logger name="Animals">
     <level value="WARN"/>
   </logger>

   <!-- ...but we need full debug for Dogs -->
   <logger name="Animals.Dog">
     <level value="DEBUG"/>
   </logger>

   <!-- ...and we want to send Cat messages over e-mail -->
   <logger name="Animals.Cat">
     <level value="INFO"/>
     <appender-ref ref="SmtpAppender"/> 
   </logger>

</log4net>

log4net のようなロギング フレームワークは、階層ロギングの概念も使用します。ロガーの名前の後にドットが続く場合、そのロガーは別のロガーの祖先であると言われます。この機能を利用するには、(ハードコードされstringた s を使用して) ロガーに手動で名前を付けるのを避け、型情報を使用して名前空間全体を含めることをお勧めします。

于 2012-06-08T11:08:39.600 に答える
-1

これは本質的にシングルトンを作成しますが、効果的な単体テストの作成など、多くの問題があります。単体テストはログに記録する必要がないため、不要な依存関係が発生します。

IoC コンテナと依存性注入の使用を検討する必要があります。

于 2012-06-08T11:08:12.070 に答える