Log4net LogicalThreadContext funktioniert nicht wie erwartet

8

Ich habe versucht Log4nets LogicalThreadContext zu verwenden, um jedem meiner Log-Einträge einen Kontext zu geben. Meine Anwendung verwendet async / erwartet ziemlich stark, aber aus dem Lesen verschiedener Artikel sollte der LogicalThreadContext ordnungsgemäß mit asynchronem Code ab .NET 4.5 arbeiten. Ich verwende .NET 4.5.1 und log4net 2.0.3

Ich stieß auf einen großartigen Artikel von Stephen Cleary über das Logging und die .NET CallContext, und als Ergebnis habe ich beschlossen, seinen Code zu nehmen und log4net zu verwenden, um zu sehen, ob etwas in meinem Code falsch war, das das Problem verursacht haben könnte.

Erstens habe ich Stephens-Code genau so ausgeführt wie er ist und die erwartete Ausgabe wie folgt erhalten.

%Vor%

Als nächstes habe ich den Code so geändert, dass log4net anstelle von Stephens custom MyStack

verwendet wird %Vor%

Ich habe erwartet, dass ich eine ähnliche Ausgabe wie zuvor bekomme, aber dieses Mal habe ich folgendes erhalten:

%Vor%

Beachten Sie, dass sich die separaten logischen Thread-Kontexte zu überlappen beginnen. Dies zeigt mir an, dass das log4net den CallContext nicht korrekt verwendet, aber von allem, was ich finde, sieht es so aus, als hätten sie bereits irgendwelche Probleme in diesem Zusammenhang behoben.

Hat irgendjemand anderes dies erfahren oder weiß, warum das passieren könnte?

    
Richard 26.04.2014, 21:31
quelle

2 Antworten

8

Leider sieht log4net immer noch nicht mit async logischen Stacks aus.

Das log4net NuGet Paket 2.0.3 ist log4net 1.2.13 (die aktuelle Version von heute). Es wurde ein Fehler gemeldet ( LOG4NET-317 ), weil zu dieser Zeit LogicalThreadContext stattdessen CallContext verwendet hat von LogicalCallContext .

Die aktuelle Version von LogicalThreadContext verwendet LogicalThreadContext , aber aktuelle Version von ThreadContextStacks verwendet nicht korrekt einen unveränderlichen Stack.

Interessanterweise hat Andrew Arnott im ursprünglichen Fehlerbericht richtig darauf hingewiesen dass sie einen unveränderlichen Stapel verwenden mussten . Im Jahr 2011.

Fühlen Sie sich frei, eine minimale Repro zu schreiben und melden Sie es als log4net Bug. Das Schlüsselszenario besteht darin, den Stapel innerhalb mehrerer Tasks zu verwenden, die mit Task.WhenAll kombiniert werden.

    
Stephen Cleary 27.04.2014, 21:00
quelle
2

Ich bin gerade auf eines unserer Projekte gestoßen. Dies sollte es beheben: Ссылка .

Der Code gehorcht im Wesentlichen den Regeln shallow-copy-on-write und immutable , die von @StephenCleary beschrieben werden, und der begleitende Testfall widersteht dem Szenario Task.WhenAll .

    
ahouben 05.03.2015 02:24
quelle