2009-12-15 5 views

답변

1

최소한 작업자 스레드의 이름을 설정할 방법이 없습니다. 그러나 log4net의 % property facility를 사용하여 로그 파일에 의미있는 스레드 이름을 생성했습니다.

0

일반적으로 어떤 작업 출력 (자신의 로거가 있어야 함)에 관심이 있으며 스레드에 관심이 없습니다.

스레드에 대한 논리 이름이 필요한 경우가 있습니까? 스레드는 풀링되고 어떤 스레드가 어떤 종류의 작업을 처리해야하는지에 대한 보장이 없습니다. 그래서 스레드 이름은 일반적으로 특정 스레드의 수명주기에서 발생한 일을 추적하기 위해 디버그 목적으로 만 사용할 수 있습니다.

+2

네, 순전히 디버그 목적으로 사용하고 있습니다. 또한이 스레드 (atleast prefixes)의 이름을 지정하면 나중에 무언가가 잘못되었을 때 로그를 감사하는 데 도움이됩니다. – asyncwait

0

이 질문은 이전 질문에 대한 새로운 대답이지만 다른 사람에게 도움이 될 수 있습니다.

내 로그 파일에 긴 석영 스레드 이름 [DefaultQuartzScheduler_Worker-1]을 좋아하지 않았습니다.

대신 스레드 ID를 표시하기 위해 log4net을 원했습니다. 따라서 현재 스레드의 ID를 기록하는 속성을 설정해야합니다.

이 클래스를 발견했습니다.
source 로깅 계산 컨텍스트의 람다/FUNC의 방법입니다 : log4net context explained

public class Log4NetContextProperty : IFixingRequired 
{ 
    private readonly Func<string> _getValue; 

    public Log4NetContextProperty(Func<string> getValue) 
    { 
     _getValue = getValue; 
    } 

    public override string ToString() 
    { 
     return _getValue(); 
    } 

    public object GetFixedObject() 
    { 
     return ToString(); 
    } 
} 

그리고 당신은 장소를 시작 응용 프로그램에서이 방법으로 호출해야합니다.

log4net.GlobalContext.Properties["threadId"] = new Log4NetContextProperty(() => Thread.CurrentThread.ManagedThreadId.ToString()); 

그런 다음 log4net 구성에서 새 속성을 포함하도록 conversionpattern을 조정하십시오. 광산은 다음과 같습니다 : 그것 뿐이다

<conversionPattern value="%d{dd.MM.yyyy HH:mm:ss,ffff} %-5level [%property{threadId}] - %message%newline" /> 

합니다. 이렇게하면 각 스레드의 ID는 런타임에 결정되고 자체 속성에 기록됩니다.

관련 문제