修改Logger的adoAppender.ConnectionString

wis*_*shy 1 c# log4net dbconnection

我正在使用 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;
           }                               
}
Run Code Online (Sandbox Code Playgroud)

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

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

mat*_*tth 5

稍微弄了一下(参考这个问题/答案和这个博客),看来<connectionString>app.config中AdoNetAppender下的<connectionType>设置需要删除,并且需要添加一个设置(如果它还没有) :

<connectionType value="System.Data.SqlClient.SqlConnection,
          System.Data, 
          Version=4.0.0.0, 
          Culture=neutral, 
          PublicKeyToken=b77a5c561934e089" />
Run Code Online (Sandbox Code Playgroud)

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

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");
Run Code Online (Sandbox Code Playgroud)

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

<connectionStringName value="ConnectionStringNameFromAppConfig" />
Run Code Online (Sandbox Code Playgroud)