案例
目前,我正在使用log4net日志记录部署WPF应用程序。在开发过程中,我对RollingFileAppender没有任何问题。但是,在Citrix环境中部署和启动时,当前用户显然没有权限在应用程序目录中写入日志文件。
问题
提前致谢!
答案 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>
更新:您可以覆盖诸如ActivateOptions
或OnClose
之类的方法,以便在配置appender后或在即将关闭时执行某些代码。