2014-11-11 12 views
1

잠시 동안 특정 파일/폴더 세트에 로그 한 다음 다른 파일 세트로 전환하고 로깅을 시작합니다. 이를 위해 유창한 API를 사용하여 원하는대로 내 파일 이름을 설정합니다 (여기에 표시되지 않음). 그러나 프로그램의 중간에서 구성을 변경할 수는 없습니다. 그것은 내가 예상했던대로 작동하지 않습니다. 구성을 다시 설정하는 경우 구성을 다시로드하거나 지우는 명령이 있습니까?프로그램의 중간에서 엔터프라이즈 라이브러리 구성을 변경하십시오.

FirstConfig(); 및 다음 Log 문을 주석 처리하면 SecondConfig()이 정상적으로 작동합니다. 그 외에는 FirstConfig() 만 효과가있는 것 같습니다.

static void Main(string[] args) 
{ 

    FirstConfig(); 
    Logger.LogInfoMessage("Before processing"); //Some wrapper around EntLib logger methods 

    //Do some processing for some time 

    SecondConfig(); 
    Logger.LogInfoMessage("After after processing"); 
} 

private static void FirstConfig() 
{ 
    var textFormatter = new FormatterBuilder() 
     .TextFormatterNamed("First Text Formatter") 
     .UsingTemplate("{message}"); 

    var builder = new ConfigurationSourceBuilder(); 
    builder.ConfigureLogging() 
     .WithOptions.DoNotRevertImpersonation() 
     .LogToCategoryNamed("General").WithOptions.SetAsDefaultCategory() 
     .SendTo.FlatFile("First Listener") 
     .FormatWith(textFormatter).WithHeader("").WithFooter("") 
     .ToFile("Logs\\BeforeChange.log"); 

    var configSource = new DictionaryConfigurationSource(); 
    builder.UpdateConfigurationWithReplace(configSource); 
    EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 
} 

private static void SecondConfig() 
{ 
    var textFormatter = new FormatterBuilder() 
     .TextFormatterNamed("Second Text Formatter") 
     .UsingTemplate("{message}"); 

    var builder = new ConfigurationSourceBuilder(); 
    builder.ConfigureLogging() 
     .WithOptions.DoNotRevertImpersonation() 
     .LogToCategoryNamed("General").WithOptions.SetAsDefaultCategory() 
     .SendTo.FlatFile("Second Listener") 
     .FormatWith(textFormatter).WithHeader("").WithFooter("") 
     .ToFile("Logs\\AfterChange.log"); 

    var configSource = new DictionaryConfigurationSource(); 
    builder.UpdateConfigurationWithReplace(configSource); 
    EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(configSource); 
} 

답변

1

마지막 줄은 새 컨테이너를 만들고 여기에 구성을 할당하는 것이므로 두 개의 다른 컨테이너를 만듭니다.

필자는 엔터프라이즈 라이브러리를 사용하면 응용 프로그램을 다시 시작하지 않고도 기존 로깅 구성 변경을 감지 할 수 있습니다. 기존 구성을 수정 한 다음 변경 사항을 처리하기 만하면됩니다.

http://msdn.microsoft.com/en-us/library/ff664363%28PandP.50%29.aspx

모든 구성 소스 클래스는 IConfigurationSource 인터페이스를 구현합니다. 이 인터페이스를 통해 응용 프로그램 코드는 구성 변경 사항에 대한 알림을 구독 할 수 있습니다. 자세한 내용은 Updating Configuration Settings at Run Time을 참조하십시오. 기본적으로 엔터프라이즈 라이브러리에서는 로깅 응용 프로그램 블록 만 등록되어 구성 변경 알림을받습니다. 엔터프라이즈 라이브러리

은 5.0 http://msdn.microsoft.com/en-us/library/ff664640%28v=pandp.50%29.aspx

"이 한 가지 예외가 응용 프로그램을 다시 시작하지 않고 구성을 구성 변경을 감지하고 다시로드 할 수있는 로깅 응용 프로그램 블록입니다.이 웹 양식 및 Windows Forms의 작동 웹 응용 프로그램을 다시 시작하도록 응용 프로그램을 자동으로 트리거하지만 구성 파일을 변경할 때 ASP.NET 응용 프로그램에서 진행중인 세션 상태 유지 관리에 의존 할 수 없습니다. "

SourceChange에 등록하여 구성 변경을 검색합니다. 이 이벤트는 IConfigurationSource 인터페이스에 정의되어 있으며 모든 Enterprise Library 구성 소스에서 구현됩니다. MyConfig.config라는 사용자 지정 파일에 저장된 구성의 변경을 감지하는 다음 예제와 같이 표준 이벤트 처리 방법을 사용하여이 이벤트를 등록 및 등록 취소 할 수 있습니다.