2017-02-15 39 views
0

У меня есть log4net, настроенный для записи в базу данных. Мой журнал конфигурации выглядит примерно так:Force 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 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?

ответ

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

Журналирование настроено таким образом, с watch = true. Проблема в том, что изменения не происходят в файле ведения журнала, это в файле web.config (и даже тогда, только в памяти, а не в самом файле). Файл регистрации ссылается только на строку подключения по имени. Поэтому, когда строка подключения добавляется, она, похоже, не подхвачена log4net. – ConditionRacer

+0

@ConditionRacer - Проверьте обновление и посмотрите, будет ли это работать. –

+0

Работает! Большое спасибо – ConditionRacer