强制log4net重试sql连接

时间:2017-02-15 18:12:21

标签: c# log4net

我已将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()

任何对log.Info/Debug/etc的后续调用都不会被写入。

有没有办法让log4net在将连接字符串添加到web.config后重试连接。或者,有没有办法推迟log4net init进程?

1 个答案:

答案 0 :(得分:2)

我在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();
     }
   }
 }