2017-02-15 59 views
0

我將log4net配置爲寫入數據庫。我的日誌配置看起來是這樣的:強制log4net重試sql連接

<?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附加器,因爲當它初始化連接字符串不可用。

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進程?

回答

2

我已經在我們的AssemblyInfo.cs

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log.config", Watch = true)] 

和使用,這也爲天青我會打電話

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(); 
    } 
    } 
} 
+0

以這種方式配置日誌記錄,watch = true。問題在於日誌文件中沒有發生變化,它在web.config中(即使這樣,只在內存中,而不是在實際的文件中)。日誌文件只按名稱引用連接字符串。所以當連接字符串被添加時,它似乎不會被log4net拾取。 – ConditionRacer

+0

@ConditionRacer - 檢查更新,看看現在是否會起作用。 –

+0

作品!非常感謝 – ConditionRacer