2011-03-01 6 views
1

내 응용 프로그램에는 무기한으로 실행되는 많은 수의 병렬 스레드가 있습니다. 나는 정보의 로깅을 위해 log4net을 사용하고 있습니다.별도의 스레드에 대한 log4net.Config의 동적로드? C# /. NET

나는 log4net에 대한 로깅 구성 정보를 동적으로 계측하고 싶습니다. (즉, 스레드 중 하나가 이상한 일을하고 있으며, 더 자세한 구성을 즉시 "주입"할 수 있습니다). Log4net.Config 메서드를 사용하여 스레드 중 하나에서 XML 구성 파일을 즉시로드합니다. 불행히도, 모든 다른 스레드에 영향을 미치는 것 같습니다.

log4net을 사용할 때 각 스레드의 구성을 분리 할 수있는 방법이 있습니까?

감사합니다.

답변

1

LogManager.GetLogger ("MyApp.Thread1")를 사용하여 실행할 각 스레드에 대해 새 로거를 만듭니다. 이 메서드는 문자열을 사용할 수 있으므로 각 문자열에 다른 이름을 지정하십시오. 그런 다음 개별적으로 로그 수준을 사용할 수 있어야합니다.

<!-- Set root logger level to DEBUG and its only appender to A1 --> 
<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="A1" /> 
</root> 

<!-- Print only messages of level WARN or above in the package Com.Foo --> 
<logger name="MyApp.Thread1"> 
    <level value="WARN" /> 
</logger> 

자세한 내용은 : 당신이 막 시작하는 경우 또한 http://logging.apache.org/log4net/release/manual/configuration.html

, Log4View을 확인하십시오. 나는 어떤 관계도없고, 단지 만족스러운 고객이있다.

0

나 자신 만 log4net을 사용하기 시작 했으므로 유용하지는 않지만 사과 드리지만이 문제는 Contexts 기능을 사용하여 해결할 수 있다고 생각합니다.

당신은 그것의 조합을 통해 특정 스레드를 얻을 수 및 상황에 맞는 필터를 사용하여 수

편집 :

을 이러한 것들을 자세히 살펴보면, Mdc/Ndc는 레거시 기능이므로 아마 이것이 아닙니다. 최선의 선택. 여기 또 다른 아이디어가 있습니다.

스레드를 식별하는 방법에 따라 (스레드 풀에서 완전히 블랙 박스 작업을 수행하지 않는 경우) 로거 이름을 지정하고 필터를 사용하여 로거 이름과 일치시킬 수 있습니다. 당신이 방법으로 설정을로드로

http://logging.apache.org/log4net/release/sdk/log4net.Filter.LoggerMatchFilter.html

당신은 한 런타임에 필터를 구성 할 수 있습니다 그것은 것이다 자동 장전 : Configuration Attributes (특히, Watch = true).

if(log.IsDebugEnabled) { /* do logging here */ }과 같은 블록을 사용하여 로깅하지 않을 때 전체 내용을 유지할 수도 있습니다.

0

"유감스럽게도 다른 모든 스레드에 영향을주는 것"이라는 것은 무엇을 의미합니까?

성능이나 잠금에 대해 생각하고 있습니다.

스레드가 잠긴 경우 (즉,첫 번째 스레드는 로그하지만 다른 하나는 로깅 호출에 멈춤) MinimalLocking 옵션 (FileAppender)이 필요합니다. 이렇게하면 로거가 로그 파일에 쓰고 나면 파일 핸들을 다른 스레드로 릴리스합니다. 불행히도 이것은 성능에 영향을 미칩니다 (그러나 성능은 여전히 ​​커널에 달려 있습니다 : Mac 또는 Linux 커널, 모노로 갈 때 열기/닫기 작업을 처리 할 때 더 빠르거나 느리면 다른 결과가 나타납니다) 열다.

최종 솔루션은 다른 와 펜더 다른 로거를 선언하는 것이다. 인스턴스화하는 각각의 로거 (이전에 알고 있어야 함)에 대해 독점 사용을 위해 전용 FileAppender을 선언하십시오. 따라서 스레드는 동시 처리 문제에 들어 가지 않습니다.

+0

나는 동의하지 않습니다. 동시성 문제없이 동일한 파일에 여러 스레드를 기록 할 수 있습니다. 로그 항목이 표시 될 순서는 아무런 보장이 없지만이 문제는 전혀 발생하지 않았습니다. OP는 아무것도 잠그고 있지 않습니다. 그는 실행하는 동안 스레드 당 로그 출력의 자세한 정보를 제어하는 ​​방법을 원합니다. –

+0

나는 동의하지 않는다. 스레드가 동일한 로거 인스턴스를 공유하면 동시성 문제가 발생하지 않지만 실제로 성능에 영향을 미칠 수 있습니다. 그러나 GetLog를 각각 한 번 호출하면 여러 인스턴스가 만들어집니다. 어쨌든, 그는 그 문제에 대해 언급하지 않았고, 그것은 진짜 문제입니다 !! –

관련 문제