2016-10-20 1 views
1

Serilog를 테스트하고 있으며 일부 문제 필드 이름을 가지고 있습니다.메시지 템플릿에 사용되지 않는 속성에 대한 Serilog 필드 이름

메시지 템플릿에 포함 된 하나의 필드와 함께 로그 항목을 추가하고 다른 필드는 쿼리를 위해 로그에 저장됩니다.

{ 
    "@timestamp":"2016-10-20T16:57:02.0623798+01:00", 
    "level":"Debug", 
    "messageTemplate":"Recalculation performed for operation {OperationId}", 
    "fields":{ 
     "OperationId":1024, 
     "__1":16, 
     "__2":32, 
     "__3":256, 
     "SourceContext":"SerilogTest.Worker" 
    } 
} 

I : 그들은 메시지 템플릿에 없기 때문에

logger.Debug("Recalculation performed for operation {OperationId}", 
       operationId, operationTypeId, otherId, anotherId); 

을하지만이 쉬운 이름을 부여되지 않는 필드 이름 결과 :

I는 다음과 같이 간단한 일을하고 싶습니다 모든 필드를 클래스에 넣을 수 있고 ForContext 메서드를 사용하여 로그 항목에 포함 할 수 있습니다.

internal class OperationData 
{ 
    public int OperationId { get; set; } 

    public int OperationTypeId { get; set; } 

    public int OtherId { get; set; } 

    public int AnotherId { get; set; } 
} 

var operationData = new OperationData 
       { 
        OperationId = 1024, 
        OperationTypeId = 16, 
        OtherId = 32, 
        AnotherId = 256 
       }; 

var operationLogger = logger.ForContext("OperationData", 
         operationData, destructureObjects: true); 
operationLogger.Debug("Recalculation performed for operation {OperationId}", 
         operationData.OperationId); 
그것은 친화적 인 필드 이름을 그냥 통과하기 위해 많은 노력처럼 보인다,

{ 
    "@timestamp":"2016-10-20T18:00:35.4956991+01:00", 
    "level":"Debug", 
    "messageTemplate":"Recalculation performed for operation {OperationId}", 
    "fields":{ 
     "OperationId":1024, 
     "OperationData":{ 
     "_typeTag":"RecalulationResult", 
     "OperationId":1024, 
     "OperationTypeId":16, 
     "OtherId":32, 
     "AnotherId":256 
     }, 
     "SourceContext":"SerilogTest.Worker" 
    } 
} 

하지만 :

이 종류의 나에게 내가 찾고 있어요 결과를 가져옵니다. 새로운 로거 인스턴스를 만들고 로그 메시지의 모든 관련 필드를 포함하는 유형을 가지고 로그를 작성해야합니다. 이보다 필드를 명명하는 쉬운 방법이 있습니까?

답변

2

익명 유형 훨씬 적은 코드로 위에서 무엇을 달성하기 : 또는

logger 
    .ForContext("Operation", new {operationTypeId, otherId, anotherId}, true) 
    .Debug("Recalculation performed for operation {OperationId}", operationId); 

또는 경우에 모든 것을 포함하여 :

logger.Debug("Recalculation performed for operation {@Operation}", new { 
     Id = operationId, TypeId = operationTypeId, OtherId = otherId, 
     AnotherId = anotherId 
    }); 

을 당신은 많은 메시지에서가 찾을 경우 동일한 속성을 포함하려는 경우 LogContext에 밀어 넣는 것이 좋습니다.

using (LogContext.PushProperty("OperationId", operationId)) 
{ 
    logger.Debug("Recalculation performed"); 

    // ...etc... 

    logger.Debug("Something else"); 
} 

이 경우 두 이벤트 모두 OperationId과 연관됩니다. 로그 컨텍스트에 여러 속성을 푸시 할 수 있습니다. 이 스타일을 사용하려면 LoggerConfigurationEnrich.FromLogContext()을 추가하십시오.

+0

저는 Serilog가 반사를 사용해야하고 익명의 유형으로 반사가 잘 작동하지 않으므로 익명의 유형이 작동하지 않는다고 가정했습니다. 나는 이것을 시도 할 것이다. –

+0

@GlenThomas Reflection은 익명의 유형에 매우 잘 작동합니다. 어떤 특정 문제가 있습니까? – user2864740

+0

@ user2864740 익명 형식의 Dapper와 같은 리플렉션 기반 라이브러리를 사용하여 과거에 문제가있었습니다. .NET Framework의 이전 버전 일 수도 있지만 형식이 익명 일 때 해당 형식의 속성 메타 데이터를 사용할 수 없거나 축소 된 것입니다. –

관련 문제