【发布时间】:2017-05-08 21:05:31
【问题描述】:
我正在为 AdoNetAppender 动态配置连接字符串。
我遇到的问题是,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
}
}
}
}
【问题讨论】:
-
嗯,是的——
XmlConfigurator.Configure配置一切,包括任何活动的附加程序。你想要你的蛋糕并且也吃掉它。您可以显式读取 XML 并在将其传递给XmlHierarchyConfigurator之前对其进行操作,或者您可以为AdoNetAppender创建一个包装类,以延迟连接字符串的初始化/验证,或者跳出 @987654329@,或者显式配置appender 在代码中打开之前是OFF(不确定这是否有效),甚至代理ADO 提供程序。不过,这些都不是很好。 -
This 可能会有所帮助
-
@JeroenMostert 你有 AdoNetAppender 包装器的例子吗?
-
不,我只是在抛砖引玉。不过,它可能就像继承它并覆盖
ActivateOptions一样简单(例如,检查连接字符串是否为空,如果是则立即返回,否则调用base.ActivateOptions())。 -
作为另一种选择,您的连接字符串似乎存储在
ConnectionStrings部分中,您可以定义您希望log4net 使用的ConnectionStringName。
标签: c# asp.net-web-api log4net