2017-02-15 5 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"); 

이것은 SQL의 펜더를 무시 log4net 원인 : 서비스가 시작되면

그래서,이 같은 작업을 수행합니다.

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 호출은 기록되지 않습니다.

web.config에 연결 문자열을 추가 한 후 log4net에서 연결을 다시 시도하는 방법이 있습니까? 또는 log4net init 프로세스를 연기 할 수있는 방법이 있습니까?

답변

2

또한 AZURE을 위해 내가

XmlConfigurator.Configure(<PathToYourConfigFile>); 

당신이 this post

에보고하고 부를 것이다 우리의 AssemblyInfo.cs

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

및이를 사용한 것을 당신을 작동하지 않는 경우 시도 할 수있다

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