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"
}
}
하지만 :
이 종류의 나에게 내가 찾고 있어요 결과를 가져옵니다. 새로운 로거 인스턴스를 만들고 로그 메시지의 모든 관련 필드를 포함하는 유형을 가지고 로그를 작성해야합니다. 이보다 필드를 명명하는 쉬운 방법이 있습니까?
저는 Serilog가 반사를 사용해야하고 익명의 유형으로 반사가 잘 작동하지 않으므로 익명의 유형이 작동하지 않는다고 가정했습니다. 나는 이것을 시도 할 것이다. –
@GlenThomas Reflection은 익명의 유형에 매우 잘 작동합니다. 어떤 특정 문제가 있습니까? – user2864740
@ user2864740 익명 형식의 Dapper와 같은 리플렉션 기반 라이브러리를 사용하여 과거에 문제가있었습니다. .NET Framework의 이전 버전 일 수도 있지만 형식이 익명 일 때 해당 형식의 속성 메타 데이터를 사용할 수 없거나 축소 된 것입니다. –