So haben wir ein Protokollierungssystem, wo wir Log.Info
verwenden und es schreibt ILogger
.ThreadLocal und erwarten
Jetzt haben wir mehrere Arbeiter im Hintergrund laufen, und wir wollen diese in ihre eigenen Protokolle schreiben. So ist alles pro Worker gebündelt. Alles, was bei der Ausführung dieser Aufgabe protokolliert wird, sollte an die eigene Protokollfunktion weitergeleitet werden.
Wir haben darüber nachgedacht, eine Methode Log.SetLoggerForCurrentThread zu erstellen und sie mit ThreadLocal zu implementieren. Die Ausführung von Code wie folgt aussehen würde:
public class Worker
{
ILogger _Logger;
public void ExecuteTask()
{
Log.Info("This goes to the 'Global' logger");
using (Log.SetLoggerForCurrentThread(_Logger))
{
Log.Info("This goes to local logger");
DoWork();
}
}
private async void DoWork()
{
Log.Info("Starting...");
// SomeMethod does some logging,
// that also needs to be forwared to the local logger
var value = await SomeDeepDomainClass.SomeMethod();
// if we use ThreadLocal, and this thread has been reused,
// it could be a completely different logger that is now attached.
Log.Info("Ended...");
}
}
Fragen
- Wenn wir erwarten verwenden, der Faden könnte theoretisch Prozess Arbeit auf einem anderen Arbeiter, damit die lokalen Logger Vermischung.
- Was ist das beste Muster, um etwas Ähnliches zu tun? Welche Speichermethode kann ich verwenden?
- Wie geht das mit
CultureInfo
?
Hintergrundinformationen
Die meisten dieser Arbeiter innerhalb einer Azure WorkerRole Instanz ausgeführt wird, aber jetzt und als sie eine Konsolenanwendung auch ausgelöst (einmal) aus sind.
'CultureInfo' eingerichtet ist, zu Beginn eines jeden verwalteten Thread - das ist unabhängig von' Task'. Ich würde die explizite Verwendung von 'Log.SetLoggerForCurrentThread' empfehlen, wenn Sie von einer' Task' abmelden wollen. Es zeigt, dass Sie explizit daran gedacht und kompensiert haben. –
Bevor ich anfange, an einer Antwort zu arbeiten, sollten Sie wissen, dass log4net kostenlos ist und die meisten Ihrer Probleme bereits löst. –
Hallo @GuillaumeCR, Sie könnten Recht haben, aber sehen Sie es als allgemeine Programmierfrage für ähnliche Muster. –