【问题标题】:Force log4net to retry sql connection强制 log4net 重试 sql 连接
【发布时间】:2017-02-15 18:12:20
【问题描述】:

我已将 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 初始化过程?

【问题讨论】:

    标签: c# log4net


    【解决方案1】:

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

    【讨论】:

    • 日志记录是这样配置的,watch = true。问题是日志文件中没有发生更改,它在 web.config 中(即使那样,仅在内存中,而不是实际文件中)。日志文件仅按名称引用连接字符串。所以当连接字符串被添加时,它似乎没有被 log4net 拾取。
    • @ConditionRacer - 检查更新,看看现在是否可行。
    • 有效!非常感谢
    猜你喜欢
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多