1

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

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

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

有没有其他方法可以获取 appender 字符串,这样我就不必在修改字符串之前进行连接?

4

1 回答 1

5

在弄乱了一点之后(参考this question/answer和this blog),看起来<connectionString>app.config中AdoNetAppender下的设置需要删除,并且<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");

另一种选择是,如果连接字符串位于<connectionString>app.config 文件中的 's 下,则可以将以下内容添加到 appender:

<connectionStringName value="ConnectionStringNameFromAppConfig" />
于 2013-11-13T22:25:38.800 回答