如何将log4net RollingFileAppender上的凭据设置为模拟?

时间:2012-04-10 09:04:13

标签: .net wpf log4net rollingfileappender

案例

目前,我正在使用log4net日志记录部署WPF应用程序。在开发过程中,我对RollingFileAppender没有任何问题。但是,在Citrix环境中部署和启动时,当前用户显然没有权限在应用程序目录中写入日志文件。

问题

  • 以某种方式是否可以向log4net和/或RollingFileAppender本身提供凭据以使用服务帐户进行记录?
  • 如果不可能,有任何解决方法的想法(除了授予所有用户对目录的权限)?

提前致谢!

2 个答案:

答案 0 :(得分: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 :(得分: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后或在即将关闭时执行某些代码。