修改Logger的adoAppender.ConnectionString

时间:2013-11-13 19:41:58

标签: c# log4net dbconnection

我正在使用log4net。问题是我只在应用程序启动后根据配置文件中的连接字符串创建连接字符串。这意味着配置文件还没有正确的连接字符串。我可以使用此代码修改appender的连接字符串..

IAppender[] appenders = log.Logger.Repository.GetAppenders();
foreach(IAppender appender in appenders)
{
     AdoNetAppender adoAppender = appender as AdoNetAppender;
        if (adoAppender != null)
           {
               adoAppender.ConnectionString = new conn string;
           }                               
}

但是,为了获取记录器(代码示例的第一行),记录器尝试使用默认连接字符串ans进行连接,因此会引发异常。

有没有其他方法可以获取appender字符串,以便在修改字符串之前不需要连接?

1 个答案:

答案 0 :(得分:4)

稍微搞了一下(参考此question/answer和此blog),看起来需要删除app.config中AdoNetAppender下的<connectionString>设置,并且需要添加<connectionType>设置(如果它还没有):

<connectionType value="System.Data.SqlClient.SqlConnection,
          System.Data, 
          Version=4.0.0.0, 
          Culture=neutral, 
          PublicKeyToken=b77a5c561934e089" />

然后您可以修改代码中的连接字符串:

log4net.Config.XmlConfigurator.Configure();
log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;

if (hier != null)
{
    var adoAppender = (AdoNetAppender)hier.GetAppenders()
                        .Where(appender => appender.Name.Equals("AdoNetAppender", StringComparison.InvariantCultureIgnoreCase))
                        .FirstOrDefault();

    if (adoAppender != null)
    {
        adoAppender.ConnectionString = connstring;
        adoAppender.ActivateOptions(); //refresh settings of appender
    }
}

ILog log = LogManager.GetLogger("test");
log.Info("Test Message");

另一种方法是,如果连接字符串位于app.config文件中的<connectionString>下,那么您可以将以下内容添加到您的appender中:

<connectionStringName value="ConnectionStringNameFromAppConfig" />