2014-10-20 4 views
0

C#을 사용하여 로그에 사용자 정의 필드를 추가하려고합니다. 나는 모든 분야에 대해 알고있을 때 그렇게 할 수있다.Log4Net을 사용하여 C#에서 동적으로 사용자 정의 필드를 추가하십시오.

이제 한 가지 시나리오에서 필자는 필드 수를 알지 못합니다. 예 : 나는 객체의 매개 변수를 추가해야하고 객체의 수는 실행 중에 변경되기 때문에 객체의 수에 따라 필드를 추가해야합니다.

이 작업을 수행하기 위해 log4net에서 수행 할 수있는 조정이 있습니까? 새 개체가 생성 될 때마다 새 필드가 만들어집니다.

log4net의 설정 파일에서이 문제를 처리하는 방법을 잘 모르겠습니다.

답변

1

당신은 log4net에 대한 custom property에 개체의 속성을 추가하고 형식의 속성의 내용을 기록 할 수 있습니다 :

코드에서 예를 들어

:

log4net.ThreadContext.Properties[ "myObjectProperties" ] = obj.prop1 + " " obj.prop2; // + ...; 

및 구성 :

<conversionPattern value="%logger (%property{myObjectProperties}) [%level]- %message%newline" /> 

즉석에서 구성 가능한 패턴을 가질 수 없습니다. 다른 객체와 일치하는 패턴을 여러 개 가질 수는 있지만 관리하기가 쉽지 않습니다.

편집 : 글쎄, 당신은 런타임 구성 패턴 만있을 수 없습니다 기본적으로 :) 당신은 아마도 상기 속성에서로드 할 수있는 패턴을 가질 수 그러나

2 편집 :만큼이있는 경우 4000 개 속성을 필요 왜 고려 중 메시지 자체 (log.Info(myObject.ToString()))의 일환으로 모든 속성을 누르거나 프로세스에 특정 인터페이스를 처리 할 수있을 것입니다 사용자 정의 펜더 만들 :

public interface IHaveManyFieldsToLog 
{ 
    public string[] GetAllPropertyValues() 
} 

public class ManyFieldsToLogAppender: SkeletonAppender 
{ 
    // pseudocode, I don't have the IDE at the moment 
    public override AppendLog(LogEvent event) 
    { 
     if (event.Parameter[0] as IHaveManyFieldsToLog != null) 
     { 
       var values = (event.Parameter[0] as IHaveManyFieldsToLog).GetAllPropertyValues(); 
       // concat all values and push it to the log 
     } 
    } 
} 
+0

확인을하지만 일치 내 요구 사항 같아. 그것의 이름이 동적 인 5000 개의 값을 추가하고 싶을 때와 같이, 어플리케이션이 실행될 때 설정됩니다. log4net.config에서 우리는 일반적으로 그 이름을 넣지 만 5000 값을 넣는 것이 동적으로 놓일 수있는 방법이 있습니다 – NitinG

+0

값이 개체에서 오는 경우 ToString 메서드 (또는 다른 일반적인 메서드 예를 들어 인터페이스에서) 객체의 각 유형에 대한 특정 값을 덤프합니다. 메소드 출력을 로깅하거나 이러한 객체를 사용자 정의 방식으로 처리하는 사용자 정의 appender를 작성하십시오. 두 번째 편집 – samy

+0

편집을 참조하십시오. 나는 PatternLayout 클래스를 재정의 (override)하고 그에 따라 모든 속성과 값을 푸시했다. 처음에는 괜찮은 것처럼 보이지만, 복잡한 복잡한 것들을 구현해야 할 때 어떻게 움직이는 지 알 수 있습니다. – NitinG

관련 문제