2016-11-22 56 views
1

我想在global.asax中以編程方式設置log4net securitycontext,但它不起作用。如果我把這個關鍵字放在web.config中,效果很好,但是我想從數據庫中獲取這些值。如何以編程方式爲log4net設置securityContext?

我的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做壞事?

回答

1

我會說你需要創建自己的appender。

log4net配置文件只是配置將在您的應用程序中使用的每個記錄器。這意味着您需要'編程'更改所有記錄器的安全上下文。但這是一個問題。您的應用程序一開始就沒有所有記錄器。

因此,您需要創建您自己的appender,並從您需要的appender繼承它。這是在log4net行爲中注入自己的邏輯的唯一方法。

+0

Finnally我這樣做你說,創建我的appender在C#中,而不是在web.config。 Thnak你! – Mikelon85

+0

很高興幫助! – MaKCbIMKo

相關問題