2009-03-08 2 views
2

Ohne in die Diskussion über die Vorzüge des EntLib-Logging-Blocks einzudringen, gibt es irgendeine Möglichkeit, die Konfiguration während der Laufzeit zu ändern.Kann ich die Konfiguration des Enterprise Library Logging-Blocks zur Laufzeit ändern?

Zum Beispiel habe ich den Block konfiguriert, allgemeine Ereignisse in eine flache Datei und kritische Ereignisse in das Ereignisprotokoll zu protokollieren.
Gibt es eine Möglichkeit, es zu ändern, um allgemeine Ereignisse auf der Konsole usw. zu protokollieren, ohne meine Anwendung neu zu starten?

Erläuterung: Ich schreibe eine lang laufende Server-Anwendung. Ich möchte in der Lage sein, die Ausführlichkeit/Ausgabe von verschiedenen Protokollierungsgruppen vorübergehend zu Diagnose-/Fehlerbehebungszwecken zu erhöhen, ohne die Anwendung neu zu starten. Der Neustart ist keine Option, da dies in der Produktion "Site-down" bedeuten würde.

Antwort

1

Ich weiß, dass Sie die ConfigurationFileMap öffnen und die Konfiguration für den Logger ändern können. Ich bin mir jedoch nicht sicher, ob dadurch das Problem auf eine Weise gelöst wird, die Sie wünschen, da das Speichern der Konfigurationsdatei die Anwendung zurücksetzt und Sie sie auf den Standardwert zurücksetzen müssen. Das ist eine Menge Arbeit, um einfach eine Konsole anzuschließen.

Da der Protokollierungsblock ein Provider-Modell verwendet, sollten Sie in der Lage sein, sich zur Laufzeit an das Protokoll anzuhängen, aber ich bin mir nicht sicher, wie dies zu tun ist. Sie haben jedoch die volle Quelle für die EntLib, also sollte das Durchlaufen des Codestapels, um das herauszufinden, keine große Aufgabe sein. Sie müssen nicht einmal zurück durch den Code reflektieren, um es zu hacken.

Ich nehme an, Ihr Ziel ist es, eine Anwendung in Echtzeit zu sehen?

+0

aktualisierte Frage - Ich schreibe eine 24/7 Server-App und würde gerne die Protokollierung in verschiedenen Bereichen für die Fehlersuche "ohne Neustart" –

+0

"Bump" Das würde nicht passieren mit Config neu schreiben, wie es neu starten würde. Keine große Sache, wenn Sie SQL für den Statusserver verwenden, aber es kann Leute mitten in einer Anfrage einbinden.Ich würde auf die Codebasis schauen oder erwägen, einen Logging-Windows-Dienst zu bauen, wie Sie dort anhängen können. –

5

Es ist eigentlich ziemlich einfach zu erreichen, folgen Sie einfach diesen Schritten:

Legen Sie die Enterprise Library-Konfiguration in einer separaten Datei

<configuration> 
    <configSections> 
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </configSections> 
    <enterpriseLibrary.ConfigurationSource selectedSource="EntLib Config"> 
    <sources> 
     <add name="EntLig Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      filePath="EntLib.config" /> 
    </sources> 
    </enterpriseLibrary.ConfigurationSource> 
</configuration> 

eine Logging-Filter hinzufügen. Sie können Protokolleintragsprioritäten oder -kategorien verwenden, um die Protokolleinträge zu filtern. Daher sollten Sie in Ihrem Code die Priorität oder Kategorie entsprechend festlegen. Zum Beispiel möchten Sie sehr wichtige Nachrichten und niedriger Priorität Nummer geben, wie 1, und ausführlichere Nachricht 10.

<configuration> 
    ... 
    <loggingConfiguration name="Logging Application Block" tracingEnabled="true" 
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"> 
    ... 
    <logFilters> 
     <add minimumPriority="1" maximumPriority="10" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     name="Priority Filter" /> 
    ... 
    </loggingConfiguration> 
</configuration> 

Alle Änderungen an Enterprise Library Konfiguration zur Laufzeit ignoriert werden könnte - außer Änderungen an der gemacht Anwendungsblock protokollieren. Siehe diesen Post auf MSDN:

Ich implementierte eine einfache Hilfsmethode, um die Filterwerte umzuschalten: Wenn ich mehr ausführliche Nachrichten möchte, erlaube ich diesen Einträgen registriert zu werden, indem ich den maximalen Prioritätswert erhöhe. Ebenso, wenn ich nur Ausnahmen oder andere sehr wichtige Nachrichten protokolliert werden sollen, habe ich den Prioritätsbereich auf 0 bis 1.

var path = System.IO.Path.Combine(Environment.CurrentDirectory, "EntLib.config"); 
var xd = XDocument.Load(path); 

var x = (from z in xd.Root.Elements("loggingConfiguration").Elements("logFilters").Elements() where (z.Attribute("name").Value == "Priority Filter") select z).SingleOrDefault(); 
x.Attribute("minimumPriority").Value = 1; // Change this value... 
x.Attribute("maximumPriority").Value = 5; // ... and this one to specify the range you want to log. 

xd.Save(path); 

Dies wird die Enterprise Library Logging-Funktionalität ändern, ohne Ihren Dienst als web.config Nachladen wird nie berührt. Einziger Nachteil ist, dass es erforderlich ist, dass Sie eine Art Konvention der Priorisierung/Kategorisierung der Protokolleinträge verwenden.

+1

Sie nennen das ziemlich einfach ?? Eine weitere Konsequenz ist, dass in der Webanwendung in filePath der vollständige Pfad geschrieben werden muss und der relative Pfad nicht funktioniert. Ich kann nicht glauben, dass entLib Microsoft Produkt überhaupt ist. –