C# log4net Configure()尝试在设置connString之前建立SQL连接

C# log4net Configure()尝试在设置connString之前建立SQL连接,c#,asp.net-web-api,log4net,C#,Asp.net Web Api,Log4net,我正在动态配置AdonNetAppender的连接字符串 我遇到的问题是,log4net.Config.XmlConfigurator.Configure()正在尝试建立与数据库的连接,但直到下一行(ConfigureLog4Net(logConnString);)才设置连接字符串 Global.asax.cs protected void Application_Start() { // Other configuration // Configure logging

我正在动态配置AdonNetAppender的连接字符串

我遇到的问题是,
log4net.Config.XmlConfigurator.Configure()
正在尝试建立与数据库的连接,但直到下一行(
ConfigureLog4Net(logConnString);
)才设置连接字符串

Global.asax.cs

protected void Application_Start()
{
    // Other configuration

    // Configure logging
    var logConnString = ConfigurationManager.ConnectionStrings["LoggingConnection"].ToString();

    if (logConnString != null)
    {
        log4net.Config.XmlConfigurator.Configure();
        ConfigureLog4Net(logConnString);
    }
}

private void ConfigureLog4Net(string logConnString)
{
    Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
    if (hierarchy != null && hierarchy.Configured)
    {
        foreach (IAppender appender in hierarchy.GetAppenders())
        {
            if (appender is AdoNetAppender)
            {
                var adoNetAppender = (AdoNetAppender)appender;
                adoNetAppender.ConnectionString = logConnString;
                adoNetAppender.ActivateOptions(); //Refresh AdoNetAppenders Settings
            }
        }
    }
}

您可以将log4net配置为从ConnectionString获取值,而不是将连接字符串本身添加到log4net配置中。不添加connectionString,而是添加:

<connectionStringName value="LoggingConnection" />


嗯,是的--
XmlConfigurator.Configure
配置一切,包括任何活动的附加程序。你想把蛋糕也吃了。您可以显式读取XML并在将其传递给
XmlHierarchyConfigurator
之前对其进行操作,也可以为
AdoNetAppender
创建一个包装类,延迟连接字符串的初始化/验证,或者从
ForwardingTappender
跳板,或者在代码中打开appender之前,将appender显式配置为关闭(不确定是否有效),甚至代理ADO提供程序。不过,这些感觉都不是很好。可以是helpful@JeroenMostert你有一个AdoNetAppender包装的例子吗?没有,我只是在胡思乱想。它可能很简单,只需将其子类化并重写
ActivateOptions
,不过(比如,检查连接字符串是否为空,如果为空,则立即返回,否则,调用
base.ActivateOptions()
)。另一个选项是,您的连接字符串似乎存储在
connectionString
部分中,您可以定义希望log4net使用的。