2009-03-08 6 views
2

장점이나 EntLib 로깅 블록에 대한 논의가 없어도 런타임에 구성을 변경할 수있는 방법이 있습니까?런타임시 엔터프라이즈 라이브러리 로깅 블록의 구성을 변경할 수 있습니까?

예를 들어 일반 이벤트를 일반 파일에 기록하고 중요 이벤트를 이벤트 로그에 기록하도록 블록을 구성했습니다.
응용 프로그램을 다시 시작하지 않고 콘솔에 일반 이벤트를 기록하도록 변경하는 방법이 있습니까?

설명 : 저는 장기 실행 서버 응용 프로그램을 작성 중입니다. 응용 프로그램을 다시 시작하지 않고 진단/문제 해결을 위해 다양한 로깅 그룹의 자세한/출력을 일시적으로 늘릴 수 있기를 바랍니다. 다시 시작하는 것은 프로덕션 환경에서 "사이트 다운"을 의미하므로 옵션이 아닙니다.

답변

1

로거에 대한 ConfigurationFileMap을 열고 구성을 변경할 수 있다는 것을 알고 있습니다. 그러나 구성 파일을 저장하면 응용 프로그램이 재설정되고 다시 기본값으로 설정해야하므로 원하는 방식으로 문제가 해결되는지 확실하지 않습니다. 이것은 단순히 콘솔을 연결하기위한 많은 작업입니다.

로깅 블록은 공급자 모델을 사용하므로 런타임에 연결할 수 있어야하지만이 작업을 수행하는 방법을 잘 모르겠습니다. 그러나 EntLib의 전체 소스를 가지고 있기 때문에 코드 스택을 실행하여이를 파악하는 것이 중요한 일은 아닙니다. 해킹 할 코드를 다시 생각할 필요조차 없습니다.

실시간으로 응용 프로그램을 보는 것이 목표라고 생각하십니까?

+0

업데이트 된 질문 - 나는 24/7 서버 응용 프로그램을 작성 중이며 다시 시작하지 않고 문제 해결을 위해 다양한 영역에서 로깅을 수행하려고합니다. –

+0

다시 시작하면 구성 재 작성에서 문제가 발생하지 않습니다. 엄청난 거래가 아니며, 주 서버에 SQL을 사용하고 있지만 요청이있을 때 사람들을 놀라게 할 수 있습니다.코드베이스를 살펴 보거나 로깅 창 서비스를 구축하는 것을 고려해 볼 수 있습니다. –

5

그것은 다음 단계를 따르 실제로 달성하기 매우 쉽습니다 :

장소 별도의 파일

<configuration> 
    <configSections> 
    <section name="enterpriseLibrary.ConfigurationSource" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </configSections> 
    <enterpriseLibrary.ConfigurationSource selectedSource="EntLib Config"> 
    <sources> 
     <add name="EntLig Config" type="Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      filePath="EntLib.config" /> 
    </sources> 
    </enterpriseLibrary.ConfigurationSource> 
</configuration> 

에서 엔터프라이즈 라이브러리 구성은 로깅 필터를 추가합니다. 로그 항목 우선 순위 또는 카테고리를 사용하여 로그 항목을 필터링 할 수 있으므로 코드에서 우선 순위 또는 카테고리를 적절히 설정해야합니다. 예를 들어, 1과 같은 매우 중요한 메시지 및 낮은 우선 순위 번호를주고 싶어하고, 더 자세한 메시지는 무시됩니다 런타임에 엔터프라이즈 라이브러리 구성에 10

<configuration> 
    ... 
    <loggingConfiguration name="Logging Application Block" tracingEnabled="true" 
    defaultCategory="General" logWarningsWhenNoCategoriesMatch="true"> 
    ... 
    <logFilters> 
     <add minimumPriority="1" maximumPriority="10" type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.PriorityFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
     name="Priority Filter" /> 
    ... 
    </loggingConfiguration> 
</configuration> 

변경 될 수 있습니다 -받는 사람 변경을 제외하고 로깅 응용 프로그램 블록. MSDN의이 게시물을 참조하십시오. Updating Configuration Settings at Run-time

필터 값을 전환하는 간단한 도우미 메서드를 구현했습니다. 자세한 메시지를 표시하려면 최대 우선 순위 값을 늘려 해당 항목을 등록 할 수 있습니다. 난 단지 기록 될 예외 또는 다른 매우 중요한 메시지를 할 때 마찬가지로, 나는 Web.config의로 서비스를 다시로드하지 않고 1

var path = System.IO.Path.Combine(Environment.CurrentDirectory, "EntLib.config"); 
var xd = XDocument.Load(path); 

var x = (from z in xd.Root.Elements("loggingConfiguration").Elements("logFilters").Elements() where (z.Attribute("name").Value == "Priority Filter") select z).SingleOrDefault(); 
x.Attribute("minimumPriority").Value = 1; // Change this value... 
x.Attribute("maximumPriority").Value = 5; // ... and this one to specify the range you want to log. 

xd.Save(path); 

이 엔터프라이즈 라이브러리 로깅 기능을 변경합니다 0에 우선 순위 범위를 설정 결코 만진 적이 없다. 단점은 로그 항목의 우선 순위 지정/범주화를 사용하는 것이 필요하다는 것입니다.

+1

당신은 이것을 매우 쉽게 부릅니까 ?? 또 다른 조건은 웹 애플리케이션에서 filePath에서 전체 경로를 작성해야하며 상대 경로가 작동하지 않는다는 것입니다. entLib은 Microsoft의 제품이라고 전혀 믿을 수 없습니다. –