4

저는 최근 Serilog를 여러 .NET Standard 클래스 라이브러리에 통합했습니다. 여기에는 MVC 6 프로젝트에서 사용되는 일부 클래스 라이브러리가 포함됩니다. 내가하고 싶은 것은 HttpContext.TraceIdentifier으로 로그 엔트리를 풍부하게하고 싶다. 어떻게 내가 Serilog 인식하게 할HttpContext.TraceIdentifier에서 읽는 Serilog 엔리치어를 어떻게 만들 수 있습니까?

public override void OnActionExecuting(ActionExecutingContext context) 
{ 
    StringValues correlationIds; 
    Guid correlationId; 

    if (!context.HttpContext.Request.Headers.TryGetValue(Constants.CorrelationIdHeaderName, out correlationIds) || correlationIds.Count != 1 || !Guid.TryParse(correlationIds[0], out correlationId)) 
    { 
     correlationId = _guidFactory.Random(); 

     context.HttpContext.Response.Headers.Add(Constants.CorrelationIdHeaderName, correlationId.ToString("D")); 
    } 

    context.HttpContext.TraceIdentifier = correlationId.ToString("D"); 

    base.OnActionExecuting(context); 
} 

문제가 상관 ID의이 요청의 삶을 위해 : 나는 존재하는 경우 Correlation-ID 요청 헤더 값으로 HttpContext.TraceIdentifier을 설정하는 액션 필터를 썼다? HttpContext.Current 속성이있는 것처럼 보이지 않으므로 작동 할 수있는 풍성한 작성 방법을 잘 모르겠습니다. 이것은 가능한가?

답변

2

나는 당신이 이것을 더 풍성하게 할 필요가 없다고 생각합니다.

을 싱크의 outputTemplate에 넣으면 "0HL0GJPLR7AOD"와 같은 ID가 표시됩니다. 로깅하기 전에 바로 HttpContext.TraceIdentifier을 설정하면 {RequestId}이 저에게 정확한 ID를 제공하므로 맞춤 ID도 {RequestId}과 함께 작동합니다.

저는 {RequestId}이 Microsoft.Extensions.Logging 기능이라고 생각하지만 적어도 Serilog.Extensions.Logging을 사용할 때는 serilog와 함께 작동합니다.

업데이트 : Enrich.FromLogContext()을 반드시 구성하십시오.

+0

나는 이것을 시도 할 것이다. 감사! – NathanAldenSr

+0

'JsonFormatter'를 사용하면 어떻게 될까요? 이 경우 Serilog는 객체를 직렬화하기 때문에'outputTemplate' 매개 변수가 없습니다. – NathanAldenSr

+0

@NathanAldenSr 'JsonFormatter'에 대해서는 모르겠지만'CompactImplatter'는'RequestId "와 같은 JSON 객체 속성으로'RequestId'와 같은 모든 이벤트 속성을 자동으로 포함합니다 :"0HL0NKROIGJ8O "' – user764754

관련 문제