2012-04-10 8 views
0

FallWie Anmeldeinformationen auf log4net RollingFileAppender zur Identität festlegen?

Derzeit bin ich im Begriff, eine WPF-Anwendung mit log4net Protokollierung einsetzen. In der Entwicklung hatte ich keine Probleme mit dem RollingFileAppender. Wenn er jedoch in einer Citrix-Umgebung bereitgestellt und gestartet wird, hat der aktuelle Benutzer offensichtlich keine Berechtigungen zum Schreiben von Protokolldateien in das Anwendungsverzeichnis.

Fragen

  • Ist es irgendwie möglich, Anmeldeinformationen zur Verfügung zu stellen log4net und/oder die RollingFileAppender sich mit einem Service-Konto anmelden?
  • Wenn nicht möglich, irgendwelche Ideen für eine Problemumgehung (außer für alle Benutzer Berechtigungen für das Verzeichnis)?

Vielen Dank im Voraus!

+0

Gibt es ein Problem beim Lesen der Anmeldedaten aus der Konfigurationsdatei? –

+0

Nein, überhaupt nicht ... Ich habe die Antwort wegen einer neu entdeckten log4net-Lösung für das Problem aktualisiert. –

Antwort

3

Nach zwei Jahren stieß ich wieder auf das gleiche Problem und fand eine anständige und eingebaute Lösung. Keine Notwendigkeit für einen benutzerdefinierten Appender mehr!

Diese Lösung ist eine Konfigurationseigenschaft, die log4net securityContext aufruft und für jeden Appender anwendbar ist. Siehe Beispiel unten.

<log4net> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="INFO" /> 
     </filter> 

     <file type="log4net.Util.PatternString" value="LogFiles\%date{yyyyMMdd}\%property{log4net:HostName}_%env{username}" /> 
     <datePattern value=".yyyyMMdd'.log'" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <maxSizeRollBackups value="10" /> 
     <staticLogFileName value="false" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%3thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 

     <securityContext type="log4net.Util.WindowsSecurityContext"> 
     <domainName value="**myDomain**"/> 
     <userName value="**myUser**" /> 
     <password value="**mySecretPassword**" /> 
     </securityContext> 
    </appender> 

    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <levelMin value="ERROR" /> 
     </filter> 

     <logName value="Application" /> 
     <applicationName value="**MyAppName**" /> 
     <Layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger{1} - %message%newline" /> 
     </Layout> 

     <securityContext type="log4net.Util.WindowsSecurityContext"> 
     <domainName value="**myDomain**"/> 
     <userName value="**myUser**" /> 
     <password value="**mySecretPassword**" /> 
     </securityContext> 
    </appender> 

    <root> 
     <level value="INFO" /> 
     <appender-ref ref="RollingFileAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
</log4net> 
1

Im nicht vertraut mit Citrix-Umgebung, aber Sie können benutzerdefinierte appender, abgeleitet von RollingFileAppender erstellen:

public class CitrixRollingFileAppender : RollingFileAppender 
{ 
    public string Login { get; set; } 
    public string Password { get; set; }  

    protected override void Append(LoggingEvent loggingEvent) 
    { 
     // use Login and Password here, or authenticate only once when appender created 
     base.Append(loggingEvent); 
    } 
} 

und Konfiguration:

<appender name="citrix" type="YourNamespace.CitrixRollingFileAppender, YourAssembly"> 
    <file value="citrixlog.txt"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Size"/> 
    <login value="Foo"/> 
    <password value="Bar"/> 
    <layout type="log4net.Layout.SimpleLayout"/> 
</appender> 

UPDATE: Sie können solche Methoden überschreiben, wie ActivateOptions oder OnClose um Code auszuführen, nachdem appender konfiguriert wurde oder wenn es kurz vor dem Schließen steht.

+0

Natürlich ist dies immer noch eine gute Lösung, aber da ich mit dem securityContext von log4net vertraut bin, bevorzuge ich diesen (siehe Antwort unten). –

Verwandte Themen