Wir haben ein intern entwickelte Logging-System, und wir wollten die Vorteile von log4net wie in der Lage zu gewinnen, gleichzeitig mehr Appen zu verwenden. Wir haben uns entschieden, das Legacy-Protokollierungssystem in einen benutzerdefinierten log4net-Appender zu verschieben. Das funktionierte gut, wenn das Legacy-System richtig konfiguriert wurde, aber der Legacy-Logger schreibt tatsächlich auf einen WCF-Client (es für die ausführliche Protokollierung langsam machen, den Grund, warum wir andere log4net Appender engagieren wollten), und vor kurzem der WCF-Konfiguration war nicht ganz das, was es gewesen sein sollte. Als das passierte, schien die Anwendung in Ordnung zu sein, aber offensichtlich funktionierte der benutzerdefinierte Appender für das Altsystem nicht. Die anderen Appender funktionierten gut, aber es gab keine Ausgabe vom benutzerdefinierten Legacy-Appender und keine Fehlermeldungen, die darauf hinwiesen, dass ein Problem auftrat.Protokollierung/Fehler in einem appender benutzerdefinierten log4net Handhabung
Was ist der richtige Weg „rekursiven“ Protokollierung zu handhaben, dass aus dem Inneren eines benutzerdefinierten log4net Appender anmeldet? Ich habe versucht, eine naive Lösung: log4net aus seinem statischen Objekt greifen und in dem appender Anmeldung:
public class MyCustomAppender : AppenderSkeleton
{
protected override void Append(log4net.Core.LoggingEvent loggingEvent)
{
try
{
// something which throws here...
}
catch (Exception ex)
{
log4net.LogManager.GetLogger(this.GetType()).Error(this.GetType().ToString() + ": error during append", ex);
}
}
}
Das war ein bitterer Ausfall „System.Threading.LockRecursionException: rekursive Lesesperre Akquisitionen in diesem Modus nicht erlaubt.“ Meinetwegen; es war die naive Lösung.
ich auch versucht:
this.ErrorHandler.Error(this.GetType().ToString() + ": error during append", ex);
im Exception-Handler, wie es möglich schien, es könnte genau das Richtige zu sein. Nichts Offensichtliches ist passiert.
Gibt es einen Weg, um Fehler durch log4net innerhalb eines appender anmelden? Oder muss ich etwas wie Hard-Code-Schreiben direkt in das Windows-Event-Log schreiben? Offensichtlich besteht eine große Gefahr des unendlichen rekursiven Abstiegs, aber ich würde meinen, dass es eine Möglichkeit geben würde, den Operator wissen zu lassen, dass einer der Appender versagte.
JR
ich vergessen, was das ursprüngliche Problem war, aber mein Punkt war ein benutzerdefinierten log4net Appender loggen in den log4net Mechanismus zur Laufzeit zu bekommen. Soweit ich weiß, wird eine "using" -Anweisung nur Dinge zur Kompilierzeit reparieren. Ich hatte überhaupt kein Kompilierproblem. Ich musste sehen, was zur Laufzeit schief lief. – jrv