2012-04-10 51 views
0

案例如何在log4net RollingFileAppender上設置憑據來模擬?

目前我正在使用log4net日誌記錄部署WPF應用程序。在開發中,我對RollingFileAppender沒有任何問題。但是,在Citrix環境中部署和啓動時,當前用戶顯然沒有權限在應用程序目錄中寫入日誌文件。

問題

  • 是它在某種程度上可以提供憑據log4net的和/或RollingFileAppender進行自身登錄與服務帳戶?
  • 如果不可行,解決辦法的任何想法(除了授予所有用戶對目錄的權限)?

在此先感謝!

+0

從配置文件中讀取證書是否存在一些問題? – 2014-08-07 08:42:05

+0

不,完全沒有......我已經更新了答案,因爲這是一個新發現的log4net內置解決方案。 – 2014-08-07 08:45:19

回答

3

兩年後,我又遇到了同樣的問題,並找到了一個體面的內置解決方案。不再需要定製appender!

該解決方案來自一個配置屬性,其log4net調用securityContext並適用於每個appender。見下面的例子。

<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

林不熟悉Citrix環境,但你可以創建自定義的appender,從RollingFileAppender進行推導:

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); 
    } 
} 

及配置:

<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> 

更新:您可以覆蓋這些方法像ActivateOptionsOnClose在appender配置完成後或者即將關閉時執行一些代碼。

+0

當然這仍然是一個很好的解決方案,但由於我熟悉log4net的securityContext,我更喜歡那個(請參見下面的答案)。 – 2014-08-07 08:43:43