为log4net设置动态连接字符串 [英] Setting up dynamic connection string for log4net

查看:405
本文介绍了为log4net设置动态连接字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用log4net,我有一个连接字符串我想在我的log4net配置中引用,因为/Config/connectionStrings.config中的connectionString将是用户的动态输入。



这是我想要做的:

 < log4net xmlns =log4net ; 
< root>
< level value =ERROR/>
< appender-ref ref =DatabaseAppender/>
< / root>

< appender name =DatabaseAppendertype =log4net.Appender.AdoNetAppender>
< bufferSize value =100/>
< connectionType value =System.Data.SqlClient.SqlConnection,System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089/>
< connectionStrings configSource =Config\ConnectionStrings.config/>
< commandText value =INSERT INTO dm.ErrorLogs([Date],[Thread],[Level],[Logger],[Message],[Exception])VALUES(@log_date,@thread,@log_level ,@logger,@message,@exception)/>
< parameter> ....
< / appender>
< / log4net>

Log4net在connectionStrings中需要这样的东西:

 < connectionString value =data source = SQLSVR; initial catalog = test_log4net; integrated security = false; persist security info = True; User ID = sa; Password = sa/> ; 

我的参考配置:
Config\ConnectionStrings.config
因此我需要第二个connectionString属性的connectionString值,它是



数据源=(本地);初始目录= DbTwo;集成安全= True; MultipleActiveResultSets = True;应用程序名称= AppName2。



有一种方法可以使用ASP.NET C#获取这个值,所以我可以在代码中创建一个数据库追加器?还是有另一个我冷的做这个在log4net.config?

 < connectionStrings> 
< add name =Connection1
connectionString =Data Source =(local);初始目录= DbOne;集成安全性= True;应用程序名称= AppName1
providerName = Data.SqlClient/>
< add name =Connection2
connectionString =Data Source =(local); Initial Catalog = DbTwo; Integrated Security = True; MultipleActiveResultSets = True; Application Name = AppName2
providerName =System.Data.SqlClient/>

解决方案>

我最终找到了答案:
动态更新连接字符串



代码如下所示:

  // connectionString是Web.config的connectionString,我想分享。 
public static void SetUpDbConnection(string connectionString,string logConfig)
{
//更新log4net的连接字符串
var hier = LogManager.GetRepository()作为层次结构;
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(logConfig));
if(hier!= null)
{
var adoNetAppenders = hier.GetAppenders()。OfType< AdoNetAppender>();
foreach(var adoNetAppender in adoNetAppenders)
{
adoNetAppender.ConnectionString = connectionString;
adoNetAppender.ActivateOptions();
}
}
}


I am using log4net and I am have a connection string I want to reference in my log4net config, because the connectionString in "/Config/connectionStrings.config" will be dynamic input from the user.

Here is what I am trying to do:

 <log4net xmlns="log4net">
    <root>
     <level value="ERROR" />
     <appender-ref ref="DatabaseAppender" />
   </root>

<appender name="DatabaseAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="100" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionStrings configSource="Config\ConnectionStrings.config" />
  <commandText value="INSERT INTO dm.ErrorLogs ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  <parameter>....
 </appender>
 </log4net>

Log4net expects something like this in the connectionStrings:

<connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sa" />

My reference config: Config\ConnectionStrings.config All of which is input from the user, so I need the connectionString value of the second connectionString attribute which is

"Data Source=(local);Initial Catalog=DbTwo;Integrated Security=True;MultipleActiveResultSets=True;Application Name=AppName2".

Is there a way to get this value using ASP.NET C#, so I can create a database appender in code? Or is there another I cold do this in the log4net.config?

   <connectionStrings>
   <add name="Connection1" 
    connectionString="Data Source=(local);Initial Catalog=DbOne;Integrated Security=True;Application Name=AppName1" 
     providerName="System.Data.SqlClient" />
   <add name="Connection2" 
     connectionString="Data Source=(local);Initial Catalog=DbTwo;Integrated Security=True;MultipleActiveResultSets=True;Application Name=AppName2" 
     providerName="System.Data.SqlClient" />

解决方案

I ended up finding the answer here: Dynamically update connection string

Code looks like this:

 //connectionString is the Web.config's connectionString, which I wanted to share.
 public static void SetUpDbConnection(string connectionString, string logConfig)
    {
        //update connection string for log4net dynamically
        var hier = LogManager.GetRepository() as Hierarchy;
        log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(logConfig));
        if (hier != null)
        {
            var adoNetAppenders = hier.GetAppenders().OfType<AdoNetAppender>();
            foreach (var adoNetAppender in adoNetAppenders)
            {
                adoNetAppender.ConnectionString = connectionString;
                adoNetAppender.ActivateOptions();
            }
        }
    }

这篇关于为log4net设置动态连接字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆