c# - tutorial - log4net xmlconfigurator




Ändern Sie log4net Logging-Ebene programmgesteuert (4)

Endlich eine funktionierende Lösung gefunden, here .

Die großen Stücke waren:

  • Sie müssen den Schwellenwert für alle Protokollierer festlegen, einschließlich des Root-Protokollierers "Kann nicht nach Namen abgerufen werden"
  • müssen die Level von der LevelMap der Hierarchie abrufen

Ein großes Dankeschön an Eddie, dass er gute, gezielte Fragen gestellt hat, was mich dazu gebracht hat, die richtigen Worte zu googeln. Ich hätte das nie alleine herausgefunden.

(Nebenbei: Repository, Hierarchie, Logger, RootLogger, LevelMap - ich hatte keine Ahnung, dass es sogar möglich ist, eine Logging-Bibliothek so komplex zu machen. Sie hat ungefähr 20 Ebenen von Indirection, was sie für alles flexibel genug macht, macht es aber fast unmöglich, einfache Dinge wie "Logge keine Nachrichten über dem Schwellenwert X" zu machen. Gah!)

Das ist ähnlich wie 650694 aber dort wurde keine Antwort akzeptiert, ich kann keinen dieser Vorschläge dazu bekommen, überhaupt zu arbeiten, und ich vermute, dass ich in einer etwas anderen Situation bin.

Ich rufe log4net.Config.XmlConfigurator.Configure () auf. Aber nach diesem Punkt im Programm möchte ich den Protokollierungsschwellenwert auf einen Wert ändern, der nur zur Laufzeit bekannt ist.

Von der anderen Frage habe ich versucht:

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error;

und:

var appender = new log4net.Appender.ColoredConsoleAppender();
appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline");
appender.Threshold = log4net.Core.Level.Error;
appender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(appender);

aber keiner scheint irgendeinen Effekt zu haben: Ich sehe immer noch DEBUG- und INFO-Logging-Anweisungen auf der Konsole.

Meine Ahnung ist, dass ich einen neuen Appender hinzufüge, der keine Auswirkungen auf den Appender hat, der in der XML-Konfiguration deklariert ist (er sagt, dass er DEBUG-Level-Nachrichten drucken soll), aber ich habe dafür noch keine Beweise.

Ich habe die log4net-API schon eine Weile durchforstet, und ich sehe es einfach nicht. Gibt es etwas Einfaches, das mir fehlt?


Es gibt einen einfachen Weg, es zu tun:

LogManager.GetRepository().Threshold = Level.Info;

Weitere Informationen finden Sie here .


Ich habe nach dem gleichen Ansatz gesucht und festgestellt, dass die neueste NLog-Version 3.2.0.0 die Option zum Ändern des Protokollierungslevels zur Laufzeit enthält.

 LogManager.GlobalThreshold = LogLevel.Debug;

Ich denke, ein anderer Ansatz könnte LogManager.Configuration , um die Konfigurationseinstellungen mit Variablen zu überschreiben.


Keine dieser hier vorgestellten Lösungen funktionierte für mich. Es änderte sich zur Laufzeit nicht

Hier ist, was bei mir funktioniert hat:

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug;
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty);

Sie müssen RaiseConfigurationChanged aufrufen, nachdem Sie Änderungen an der Konfiguration vorgenommen haben.





log4net