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
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?
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.
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
.
Tags und Links c# async-await asynchronous log4net