2009-04-03 6 views
48

이 메시지는 650694과 비슷하지만 아무런 응답도받지 못했습니다. 그런 제안이 전혀 들리지 않으며 약간 다른 상황에 처해있을 수 있습니다.log4net 로깅 수준을 프로그래밍 방식으로 변경하십시오.

저는 log4net.Config.XmlConfigurator.Configure()를 호출합니다. 그러나 프로그램의이 시점 이후에 로깅 임계 값을 런타임에만 알려진 값으로 변경하려고합니다.

((log4net.Repository.Hierarchy.Logger)mylogger.Logger).Level = log4net.Core.Level.Error; 

과 : 다른 질문에서

, 나는 시도

var appender = new log4net.Appender.ColoredConsoleAppender(); 
appender.Layout = new log4net.Layout.PatternLayout(@"%date %-5level %message%newline"); 
appender.Threshold = log4net.Core.Level.Error; 
appender.ActivateOptions(); 
log4net.Config.BasicConfigurator.Configure(appender); 

을하지만, 어느 하나가 어떤 영향을 미칠 것으로 보인다 : 나는 아직도 DEBUG보고 있어요 및 정보가 콘솔에 문 로깅 .

내 직감은 새로운 appender를 추가하고 있는데, 이는 XML config (DEBUG 레벨 메시지를 출력한다고 알려주는) appender에 아무런 영향을주지 않지만, 아직 어떤 증거도 없다. .

저는 지금 log4net API를 잠시 파고 있었고, 지금은 보지 않고 있습니다. 내가 누락 된 간단한 것이 있습니까?

+1

로거 수준을 "오류"로 설정하면 해당 로거의 디버그 또는 정보 출력이 로깅되지 않습니다. 로깅 수준을 변경중인 바로 로거에 대해 디버그 및 정보가 표시됩니까? – Eddie

+0

좋은 지적입니다. # 1은 아마도 한 로거에 대한 임계 값 만 설정합니다. 그러나 # 2는 그것이 글로벌해야하는 것처럼 보입니다. – Ken

+0

예 # 1은 변경중인 단일 Logger 인스턴스에 대한 임계 값과 명시 적으로 설정된 레벨이없는 계층의 Logger 아래에만 설정합니다. – Eddie

답변

22

마지막으로 작업 해결책, here이 발견되었습니다.

큰 조각했다 :

  • 필요가
  • 는 계층 구조의 LevelMap에서 레벨을 얻을 필요가 루트 로거 "이름을 검색 할 수 없습니다"를 포함한 모든 로거에 임계 값을 설정하는

Google에 올바른 단어를 알려주는 좋은 지적 질문을 한 Eddie에게 큰 감사드립니다. 나는 이것을 혼자서 알아 내지 못했을 것이다.

(Repository, Hierarchy, Logger, RootLogger, LevelMap - 로깅 라이브러리를 복잡하게 만드는 것도 가능하지 않았습니다. 약 20 계층의 간접 참조가 있습니다. 아무것도 충분하지만, "임계 X 위의 모든 메시지를 기록하지 않는다"처럼 거의 불가능 간단한 일을 할 수 GAH)

+0

야, 그건 내가 상상했던 것보다 더 복잡해! 좋은 링크. 650694 질문의 답은 log4Net 1.2.10과 함께 여러 응용 프로그램에서 저에게 효과적이었습니다. 왜 당신에게 효과가 없었는지 모르겠지만, 당신이 발견 한 것은 * 철저합니다! – Eddie

8

그것을 할 수있는 간단한 방법이있다 :.!

LogManager.GetRepository().Threshold = Level.Info; 

상세 정보 찾을 수 있습니다 here.

+4

로깅이 이미 구성된 후에도 로깅 수준이 변경되지 않았습니다. –

+2

RaiseConfigurationChanged를 통해 구성이 변경되었음을 알려줘야합니다. –

62

여기에 제시된 해결책 중 현재 나와있는 것은 없습니다. 그것은 여기에

이 나를 위해 일한 것입니다 런타임에 변경되지 않았습니다 :

((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root.Level = Level.Debug; 
((log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).RaiseConfigurationChanged(EventArgs.Empty); 

당신은 그것의 설정을 변경 한 후 RaiseConfigurationChanged를 호출해야합니다.

+0

예 - 완벽하게 작동합니다. 감사. –

0

동일한 접근법을 찾고 있었고 최신 NLog 버전 3.2.0.0이 런타임시 로깅 수준을 변경하는 옵션을 제공한다는 것을 알았습니다.

LogManager.GlobalThreshold = LogLevel.Debug; 

나는 또 다른 방법은 변수를 사용하여 구성 설정을 덮어 LogManager.Configuration을 사용하는 것 같아요.

+0

LogManager.GlobalThreshold의 기본값은 LogLevel.Trace입니다. – seUser

1

모든 답변을 시도했지만 그 중 아무 것도 작동하지 않았습니다. 디버거에서 모든 로거 수준, 루트 수준, 임계 값이 지시대로 설정되었음을 알 수있었습니다. 그럼에도 불구하고 로깅 중이던 롤링 파일에서 로그 수준이 변경되지 않았습니다.

그런 다음 구성 파일에서 appender 요소에서도 임계 값을 지정했습니다. 예를 들어 appender가 Warn으로 설정되어있는 동안 레벨을 Debug로 변경하려고 할 때, 그 appender는 임계 값 이하 였기 때문에 추가 메시지를받지 않았습니다. 그래서 appender 구성에서 임계 값을 제거하고 레벨 구성 만 유지했습니다.

<root> 
    <level value="Warn" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

그런 다음 Ken의 솔루션을 사용하여 런타임시 레벨을 변경했습니다.

관련 문제