如何以编程方式为 log4net 设置 securityContext?
How can I set securityContext for log4net programmatically?
我试图在 global.asax 中以编程方式设置 log4net securitycontext,但它不起作用。如果我将此键放入 web.config 中,效果很好,但我想从数据库中获取这些值。
我的 web.config 有效:
<log4net>
<appender name="FileAppenderGeneral" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs\app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'dd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %-5p - %m%n" />
</layout>
<<securityContext type="log4net.Util.WindowsSecurityContext">
<domainName value="hostname"/>
<userName value="username" />
<password value="password" />
</securityContext>
<encoding value="utf-8" />
</appender>
我的 global.asax 不起作用:
log4net.Config.XmlConfigurator.Configure();
ILog[] loggers = LogManager.GetCurrentLoggers();
foreach (ILog logger in loggers)
{
foreach (IAppender appender in logger.Logger.Repository.GetAppenders())
{
if (appender.GetType() == typeof(RollingFileAppender))
{
log4net.Appender.RollingFileAppender fileAppender = (RollingFileAppender)appender;
WindowsSecurityContext securityContext = new log4net.Util.WindowsSecurityContext();
securityContext.DomainName = "hostname";
securityContext.UserName = "username";
securityContext.Password = "password";
securityContext.ActivateOptions();
fileAppender.SecurityContext = securityContext;
}
}
}
知道我在 global.asax 中做错了什么吗?
我会说你需要创建自己的 appender。
log4net 配置文件只是针对将在您的应用程序中使用的每个记录器的配置。这意味着您将需要 'programmatically' 更改所有记录器的安全上下文。但这里有一个问题。您在应用程序开始时没有所有记录器。
因此,您需要创建自己的appender 并从您需要的appender 继承它。这是在 log4net 行为中注入您自己的逻辑的唯一方法。
我试图在 global.asax 中以编程方式设置 log4net securitycontext,但它不起作用。如果我将此键放入 web.config 中,效果很好,但我想从数据库中获取这些值。
我的 web.config 有效:
<log4net>
<appender name="FileAppenderGeneral" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Logs\app.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="'.'dd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d %-5p - %m%n" />
</layout>
<<securityContext type="log4net.Util.WindowsSecurityContext">
<domainName value="hostname"/>
<userName value="username" />
<password value="password" />
</securityContext>
<encoding value="utf-8" />
</appender>
我的 global.asax 不起作用:
log4net.Config.XmlConfigurator.Configure();
ILog[] loggers = LogManager.GetCurrentLoggers();
foreach (ILog logger in loggers)
{
foreach (IAppender appender in logger.Logger.Repository.GetAppenders())
{
if (appender.GetType() == typeof(RollingFileAppender))
{
log4net.Appender.RollingFileAppender fileAppender = (RollingFileAppender)appender;
WindowsSecurityContext securityContext = new log4net.Util.WindowsSecurityContext();
securityContext.DomainName = "hostname";
securityContext.UserName = "username";
securityContext.Password = "password";
securityContext.ActivateOptions();
fileAppender.SecurityContext = securityContext;
}
}
}
知道我在 global.asax 中做错了什么吗?
我会说你需要创建自己的 appender。
log4net 配置文件只是针对将在您的应用程序中使用的每个记录器的配置。这意味着您将需要 'programmatically' 更改所有记录器的安全上下文。但这里有一个问题。您在应用程序开始时没有所有记录器。
因此,您需要创建自己的appender 并从您需要的appender 继承它。这是在 log4net 行为中注入您自己的逻辑的唯一方法。