Ich bin auf der Suche nach Tipps, wie Log4Net Logging-Level in meinen ASP.NET-Apps am besten rekonfiguriert werden können. Im Allgemeinen verwende ich eine einfache Konfiguration, bei der der Stammlogger die Standardprotokollierungsstufe definiert, z.Log4Net dynamisch rekonfigurieren
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
und es kann mehrere Appen sein, die jeweils mit Filter, um die Protokollebenen verwenden sie zu definieren.
Das erste, was ich in der Lage sein möchten, zu tun wäre, Administratoren zu ermöglichen, auf eine Admin-Seite zu verbinden, die ihnen ermöglicht, (a) das aktuelle Niveau für den Root-Logger anzuzeigen und (b) dynamisch ändern Sie es. Ich möchte "ConfigureAndWatch" nicht verwenden und in die Konfigurationsdatei auf dem Datenträger schreiben, da diese Änderungen nicht beibehalten werden sollen, wenn die Anwendung wiederverwendet wird.
Als nächstes möchte ich weiter gehen und auf einer Admin-Seite in der Lage sein, eine TreeView mit allen aktuellen Loggern, die in der Anwendung existieren, und ihre aktuelle Protokollierungsebene anzuzeigen. Und erlauben Sie dem Administrator, die Protokollierungsstufe auf jeder Ebene der Hierarchie selektiv zu ändern.
Die Idee ist, eine generische Admin-Seite zu erstellen, die ich in all meinen Anwendungen setzen kann, die Administratoren ermöglicht, DEBUG-Level-Protokollierung dynamisch zur Fehlerbehebung selektiv zu aktivieren.
Ich finde die Log4Net APIs ein wenig verwirrend, kann jemand auf Stichproben zeigen oder zeigen Sie den besten Weg, dies zu erreichen.
Update:
Beide Antworten sind gleich gut, also habe ich akzeptiert die erste - danke. Wiederzuschätzen, kann ich alle aktuellen Logger erhalten wie folgt:
foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
log4net.Repository.Hierarchy.Logger logger =
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
logger.Name,
logger.Parent.Name,
logger.Level == null ? "<null>" : logger.Level.Name,
logger.EffectiveLevel
)
);
}
EffectiveLevel ist die effektive Ebene - wie Stufe, wenn diese nicht Null ist, andernfalls von dem übergeordneten geerbt.
Mindestens einer der Logger, die oben zurückgegeben wurden, wird der Root-Logger als übergeordnetes Element haben, was es mir ermöglicht, einen Verweis auf den Root-Logger zu erhalten.
Mit dem oben genannten sollte es möglich sein, die Logger-Hierarchie zu rekonstruieren.
aktualisieren 2
Nochmals vielen Dank. Ich habe ein ASP.NET-Serversteuerelement implementiert, das die Loggerhierarchie in einem TreeView mit Kontrollkästchen anzeigt, und es dem Benutzer ermöglicht, das Protokollierungslevel an jedem Knoten in der Hierarchie dynamisch zu ändern. Funktioniert hervorragend und ich setze es auf die Admin-Seite in allen meinen ASP.NET Web- und Webservice-Apps!
ich den obigen Code getestet und festgestellt, dass ich eine Schleife benötigt durch all die Repositories und die doppelte Art überprüfen. foreach (var repo in LogManager.GetAllRepositories()) foreach (var. Loggers in repo.GetCurrentLoggers() OfType()) logger.Level = Level; –
FYI: Ich habe einmal Probleme mit Parallelität bei der Verwendung der dynamischen log4net-Konfigurations-API festgestellt - es scheint nicht Thread-sicher zu sein. – galaktor
Welche Version von Log4net war das? Ich sehe keine Implementierungen von ILog, die nach Repository castebar sind. Hierarchy.Logger –