2017-11-26 30 views
1

Serilog 로깅 기능에서 매개 변수의 특정 템플릿을 사용하도록 계약을 만들고 싶습니다.Serilog에서 특정 매개 변수 사용 (일반적으로 외부 함수에서)

내 기능으로 캡슐화하지 않고이 작업을 수행 할 수있는 방법이 있습니까 (각 로깅 수준에서 수행해야합니까)?

이벤트 유형, 기능 등을 포함하는 EventLog라는 네임 스페이스가 있습니다. 로깅 할 때 해당 네임 스페이스의 이벤트 유형 및 기능을 사용하도록 시행하고 싶습니다.

보다는 :

void _LogLevel_<T0, T1, T2>(string messageTemplate, T0 propertyValue0, T1 propertyValue1, T2 propertyValue2);

나는이 시행 싶습니다 두 개의 매개 변수가 지정되지 않은 경우 컴파일하지 않을 코드를 가정

void _LogLevel_<EventLog.EventItem, EventLog.Facility, T0, T1>(string messageTemplate, EventLog.EventItem EventType, EventLog.Facility Facility, T0 propertyValue0, T1 propertyValue1, ...);

하고, 먼저 2 개의 객체는 어떤 일반적인 것 T0, T1, ...이 Serilog에있을 것이므로 직렬화 될 것입니다.

이것은 로깅 기능이 호출 될 때 주어진 매개 변수가 항상 추가된다는 것을 보장하기위한 것입니다.

또 다른 문제점은 Serilog 자체 DSL이기 때문에 문자열 인 messageTemplate{@Event}, {@Facility}을 추가 할 수 없습니다.

답변

1

메시지 템플릿을 통해이 작업을 수행하는 것은 힘들어 보이는 것처럼 보입니다. 당신은 당신이 추가 방법 Serilog의 ForContext()에 돼지 - 백업에 의해 계신 달성 할 수 : 당신이 MyLog.ForEvent(e, f).Information("Hello!")처럼

public static ILogger ForEvent(EventItem item, EventFacility facility) 
{ 
    return Log.ForContext("Event", item, true).ForContext("Facility", facility, true); 
} 

를 호출 할 것입니다 어느.

오히려 위의 예에서, 당신은 확장 메서드를 시도 할 수 있습니다 사용하는 정적 Log 클래스보다 ILogger를 사용하는 경우 :

public static ILogger ForEvent(this ILogger log, EventItem item, EventFacility facility) 
{ 
    return log.ForContext("Event", item, true).ForContext("Facility", facility, true); 
} 
+0

이 지정된 객체를 직렬화 것인가를? (나는 당신이 함수에 전달한 불린 매개 변수라고 가정하고있다). 그리고 의무적으로 만들 수있는 방법이 있습니까? 감사! –

+0

네, 그게 목적입니다. –