强制 log4net 重试 sql 连接
Force log4net to retry sql connection
我将 log4net 配置为写入数据库。我的日志配置如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<root>
<appender-ref ref="SqlAppenderAll" />
<level value="DEBUG" />
</root>
<appender name="SqlAppenderAll" type="log4net.Appender.ADONetAppender">
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionStringName value="MyConnectionString" />
...
</appender>
</log4net>
问题是,MyConnectionString 不能立即使用。服务的许多配置项存储在配置数据库中,并在服务启动时检索。这允许为整个系统配置一次连接字符串,而不是为每个服务单独配置。
所以当服务启动时,它会做这样的事情:
var myConnectionString = ConfigProvider.GetConnectionString("MyConnectionString");
AddConnectionString(myConnectionString, "web.config");
这会导致 log4net 忽略 sql appender,因为连接字符串在初始化时不可用。
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Could not open database connection []. Connection string context [Unable to determine connection string context.].
log4net.Core.LogException: Unable to find [MyConnectionString] ConfigurationManager.ConnectionStrings item
at log4net.Appender.AdoNetAppender.ResolveConnectionString(String& connectionStringContext)
at log4net.Appender.AdoNetAppender.InitializeDatabaseConnection()
任何后续调用记录。Info/Debug/etc 永远不会被写入。
有没有办法让 log4net 在将连接字符串添加到 web.config 后重试连接。或者,有没有办法推迟 log4net init 进程?
我在我们的 assemblyinfo.cs
中使用过这个
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]
还有 AZURE,我会打电话给
XmlConfigurator.Configure(<PathToYourConfigFile>);
你看过了吗this post
如果不行你可以试试
public static void SetAdoNetAppenderConnectionStrings(string connectionStringKey)
{
var hier = (Hierarchy)LogManager.GetRepository();
if (hier != null)
{
var appenders = hier.GetAppenders().OfType<ADONetAppender>();
foreach (var appender in appenders)
{
appender.ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringKey].ConnectionString;
appender.ActivateOptions();
}
}
}
我将 log4net 配置为写入数据库。我的日志配置如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<root>
<appender-ref ref="SqlAppenderAll" />
<level value="DEBUG" />
</root>
<appender name="SqlAppenderAll" type="log4net.Appender.ADONetAppender">
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionStringName value="MyConnectionString" />
...
</appender>
</log4net>
问题是,MyConnectionString 不能立即使用。服务的许多配置项存储在配置数据库中,并在服务启动时检索。这允许为整个系统配置一次连接字符串,而不是为每个服务单独配置。
所以当服务启动时,它会做这样的事情:
var myConnectionString = ConfigProvider.GetConnectionString("MyConnectionString");
AddConnectionString(myConnectionString, "web.config");
这会导致 log4net 忽略 sql appender,因为连接字符串在初始化时不可用。
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Could not open database connection []. Connection string context [Unable to determine connection string context.].
log4net.Core.LogException: Unable to find [MyConnectionString] ConfigurationManager.ConnectionStrings item
at log4net.Appender.AdoNetAppender.ResolveConnectionString(String& connectionStringContext)
at log4net.Appender.AdoNetAppender.InitializeDatabaseConnection()
任何后续调用记录。Info/Debug/etc 永远不会被写入。
有没有办法让 log4net 在将连接字符串添加到 web.config 后重试连接。或者,有没有办法推迟 log4net init 进程?
我在我们的 assemblyinfo.cs
中使用过这个[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)]
还有 AZURE,我会打电话给
XmlConfigurator.Configure(<PathToYourConfigFile>);
你看过了吗this post
如果不行你可以试试
public static void SetAdoNetAppenderConnectionStrings(string connectionStringKey)
{
var hier = (Hierarchy)LogManager.GetRepository();
if (hier != null)
{
var appenders = hier.GetAppenders().OfType<ADONetAppender>();
foreach (var appender in appenders)
{
appender.ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringKey].ConnectionString;
appender.ActivateOptions();
}
}
}