2011-01-11 4 views
0

Ich implementiere eine Logging-Lösung mit Log4Net für einen Windows NT Service. Ich kann einen Schalter in einer Konfigurationsdatei umdrehen, um mit der Protokollierung von Informationen im Dateisystem zu beginnen. Bisher konnte ich dies erreichen, indem ich einen rollenden Datei-Appender hatte und log4net "Watch" der Konfigurationsdatei hatte.Was passiert, wenn Log4Net nicht berechtigt ist, auf das Dateisystem zuzugreifen

Ich habe festgestellt, dass Log4Net leere Protokolldateien erstellt, sobald der Dienst gestartet wird, auch wenn alle Protokollierung deaktiviert ist und ich nicht beabsichtige, zu protokollieren.

ich nicht viele Informationen zu diesem Thema außer diesem Beitrag finden:

How to disable creation of empty log file on app start?

Meine Sorge ist, dass jemand den Dienst mit einem sehr niedrigen Niveau Satz von Berechtigungen einrichten könnte das wäre nicht habe sogar Zugriff, um die Protokolldateien im Dateisystem zu erstellen. Ich möchte nicht die Leistungseinbuße erleiden, dass jedes Mal, wenn ich eine Protokollierungsanweisung triff, Ausnahmen ausgelöst werden, selbst wenn ich nicht beabsichtige, mich einzuloggen.

Ich habe jede Logging-Anweisung mit check umgangen, um zu sehen, ob die Logging-Ebene aktiviert ist, bevor ich logge, aber ich bin immer noch nicht sicher, ob in den inneren Funktionen von log4net Ausnahmen noch geworfen werden wenn die im Appender konfigurierte Datei nicht erstellt wurde.

Weiß jemand, was Log4net tun wird, wenn es die Protokolldateien anfänglich nicht erstellen kann?

Hier sind ein paar Informationen über meine Konfiguration. Protokollierung funktioniert einwandfrei, wenn es aktiviert ist. Ich mache mir nur Sorgen um Berechtigungsprobleme.

Attribut auf meine Logging-Klasse für Konfigurationsänderungen zu sehen:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Logging.config", Watch = true)]

Appender:

<appender name="Test" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value=".\\AppLogs\\_test.%appdomain.log" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ALL" /> 
     <levelMax value="FATAL" /> 
     <acceptOnMatch value="false"/> 
    </filter> 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="Test" /> 
    </filter> 
    <appendToFile value="true" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="6MB" /> 
    <rollingStyle value="Size" /> 
    <staticLogFileName value="true" /> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level - %message%newline" /> 
    </layout> 
    </appender> 
+0

Ich bin mir nicht sicher, ob dies 2011 zutrifft, aber zumindest bei den letzten Versionen von Log4Net wird intern geprüft, ob die angegebene Protokollstufe aktiviert ist, bevor tatsächlich versucht wird, etwas zu protokollieren. Die Funktionen wie IsDebugEnabled sind nur dann nützlich, wenn es CPU/Ressourcenintensiv ist, die an den Logger gesendeten Daten zu erzeugen. Related, Funktionen wie DebugFormat haben den doppelten Zweck, knapp zu sein, aber auch, dass es nicht die tatsächliche Zeichenfolge tun muss.Format, es sei denn, die Protokollebene ist aktiviert. – ShawnFumo

Antwort

1

„Meine Sorge ist, dass jemand den Dienst mit einem sehr niedrigen Level-Set einrichten könnte der Berechtigungen, die nicht einmal Zugriff auf die Protokolldateien im Dateisystem haben würden. "- Beim Start des Dienstes muss festgestellt werden, ob die erforderlichen Mindestanforderungen erfüllt sind, und eine Ausnahme auslösen (oder anderweitig behandeln), falls dies nicht der Fall ist.

Ich glaube nicht, dass dies ein Protokollierungsproblem per se ist; Es ist eher ein Problem, ob Ihr Dienst die erforderlichen Berechtigungen besitzt oder nicht.

+0

Das ist ein guter Vorschlag. Ich habe in diesem Post gelesen, dass ich sicherstellen möchte, dass ich an den entsprechenden Speicherort für Windows 7 und Windows Server 2008 schreibe http://stackoverflow.com/questions/468989/how-to-specifiy-common-application- data-folder-for-log4net ... gibt es ein gutes Muster, um dem Benutzer mitzuteilen, warum der Dienst nicht gestartet werden kann? Am wahrscheinlichsten, wenn ich nicht zum ProgramData-Standort schreiben kann, wie gebe ich dem Benutzer eine Nachricht darüber, warum der Dienst nicht startet? – Loathian

+0

Mitch, ich ging voran und akzeptierte Ihre Antwort, da es ein paar Tage war und es keine weiteren Postings gab. Danke für die Rückmeldung. – Loathian

Verwandte Themen