2017-05-21 23 views
0

をコンソールにメッセージを複製:コンソールで注入log4netのログ、次のように私はlog4netのを注入してい

DI

container.RegisterSingleton<Func<object, ILog>>(instance => { 
    return LogManager.GetLogger(instance.GetType()); 
}); 

使用

public class MyClass { 
    private readonly ILog _logger; 

    public MyClass(Func<object, ILog> loggerFactory) { 
     _logger = loggerFactory(this); 
    } 
} 

、私は予測可能な複製を取得メッセージ。メッセージプリントの第一セット一回、第二の二倍を設定し、第六それも私ドン以来コンソールにログインしている理由、私はわからないなど、6回、...正直

4470 [6] INFO JobManager - Getting pending jobs... 
5953 [5] DEBUG JobManager - #113: 1/14 (7.14 %) 
6489 [6] INFO JobManager - Getting pending jobs... 
6489 [6] INFO JobManager - Getting pending jobs... 
7679 [8] DEBUG JobManager - #113: 2/14 (14.29 %) 
7679 [8] DEBUG JobManager - #113: 2/14 (14.29 %) 
8512 [6] INFO JobManager - Getting pending jobs... 
8512 [6] INFO JobManager - Getting pending jobs... 
8512 [6] INFO JobManager - Getting pending jobs... 
9551 [29] DEBUG JobManager - #113: 3/14 (21.43 %) 
9551 [29] DEBUG JobManager - #113: 3/14 (21.43 %) 
9551 [29] DEBUG JobManager - #113: 3/14 (21.43 %) 

を設定しましたそのアペンダーが設定されているか、有効になっていて、設定ファイルのXmlConfigurator.Configure()とlog4net関連のものをコメントアウトしてもそれはありません。私が使用している唯一のアペンダーはジブラルタルです。私はこれをVSから実行しており、デバッグではなく、デバッグとリリースの両方の設定を同じ結果で試しています。ファイルアペンダーを追加しました。結果のログファイルに行が重複しません。

<logger name="myloggername" additivity="false"> 
+0

リクエストごとにシングルトンを生成しないことを証明するために、 'LogManager.GetLogger()'を返すようにブレークポイントを設定できますか?ちょっと考えました... – Waescher

+0

なぜILOGではなくFuncを注入していますか?気になります。 – CodingYoshi

+0

@コーディングヨシ各タイプに独自のロガーを付けることができます。あなたの質問を誤解しない限り...? –

答えて

0

それは別の開発者が適切にDIを介して注入されていなかったクラスのコンストラクタ内XmLConfigurator.Configure()を呼び出していたことが判明:

0

あなたはおそらくあなたのロガーに設定されていない加法性を持っています。したがって、クラスがインスタンス化されるたびに、log4netが再度構成され、構成された各ロガーの別のインスタンスが追加されます。

+0

実際に私はこれを理解して答えを掲示します。 –

関連する問題