2017-05-21 3 views
0
zu trösten

Ich Injektion log4net wie folgt:injizierte log4net Protokolle Nachricht duplizieren

DI

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

Nutzungs

public class MyClass { 
    private readonly ILog _logger; 

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

in der Konsole bekomme ich berechenbar doppelte Mitteilungen. Der erste Satz von Nachrichten druckt einmal, die zweite zwei Mal eingestellt, stellen die sechste sechsmal, etc ...

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 %) 

Ehrlich gesagt, ich bin nicht sicher, warum es auch auf die Konsole da ich don einloggen Habe diesen Appender nicht konfiguriert oder aktiviert, und es funktioniert auch, wenn ich XmlConfigurator.Configure() und die log4net-bezogenen Dinge in der Konfigurationsdatei auskommentiere. Der einzige Appender, den ich benutze, ist Gibraltar. Beachten Sie, dass ich dies von VS ausführe, nicht debugge, und habe sowohl Debug- als auch Release-Konfigurationen mit dem gleichen Ergebnis ausprobiert. Ich fügte eine Datei Appender und die Zeilen sind nicht doppelt in der resultierenden Protokolldatei.

+0

Können Sie einen Haltepunkt für 'return LogManager.GetLogger()' setzen, nur um zu beweisen, dass Sie keine Singletons für jede Anfrage produzieren? Nur ein Gedanke ... – Waescher

+0

Warum injizierst du einen Func und nicht einfach einen ILog? Ich bin neugierig. – CodingYoshi

+0

@CodingYoshi So kann jeder Typ seinen eigenen Logger haben. Wenn ich deine Frage nicht falsch verstehe ...? –

Antwort

0

Es stellt sich heraus, dass ein anderer Entwickler XmLConfigurator.Configure() im Konstruktor einer Klasse aufrufen worden war, die nicht ordnungsgemäß über DI injiziert wurde. Jedes Mal, wenn die Klasse instanziiert wurde, wurde log4net erneut konfiguriert und eine weitere Instanz jedes konfigurierten Loggers hinzugefügt.

0

Sie haben wahrscheinlich die nicht konfiguriert additivity auf Logger:

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

Eigentlich habe ich das herausgefunden und werde meine Antwort posten. –

Verwandte Themen