簡體   English   中英

一旦我添加了自定義 ExceptionFilter,Serilog 就會停止記錄異常

[英]Serilog stops logging exceptions as soon as I add a custom ExceptionFilter

我已將 Serilog 添加到我的項目中:

程序.cs

.UseSerilog((provider, context, loggerConfiguration) =>
{
    loggerConfiguration
        .MinimumLevel.Verbose()
        .MinimumLevel.Override("Microsoft", LogEventLevel.Warning);
        .WriteTo.MSSqlServer(output, tableName: "Log", schemaName: "WPS")
        .Enrich.WithAspnetcoreHttpcontext(provider)
        .Enrich.WithExceptionDetails();
});

我還添加了一項服務,用於處理返回到 UI 的 API 錯誤:

啟動.cs

// Add Error Handling to all API endpoints
services.AddMvc(options => {
      options.Filters.Add(new ApiExceptionFilter());
});

ApiExceptionFilter.cs

public class ApiExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        ApiError apiError = null;
        if (context.Exception is ApiException)
        {
            var ex = context.Exception as ApiException;
            context.Exception = null;
            apiError = new ApiError(ex.Message);
            apiError.Errors = ex.Errors;
            context.HttpContext.Response.StatusCode = ex.StatusCode;
        }
        else if (context.Exception is UnauthorizedAccessException)
        {
            apiError = new ApiError("Unauthorized Access");
            context.HttpContext.Response.StatusCode = 403;
        }
        else
        {
            string msg = context.Exception.GetBaseException().Message;
#if !DEBUG
            string stack = "";
#else
            string stack = context.Exception.StackTrace;
#endif

            apiError = new ApiError(msg);
            apiError.Detail = stack;
            context.HttpContext.Response.StatusCode = 500;
        }
        context.Result = new JsonResult(apiError);

        base.OnException(context);
    }
}

但是,添加 ApiExceptionFilter 后,不再記錄異常。

我已經嘗試再次拋出異常,但是我的自定義消息不再返回到 UI。

ApiExceptionFilter.cs

        base.OnException(context);
        throw context.Exception.GetBaseException(); // throw again?

關於我要去哪里錯的任何建議?

在這里,您最好的選擇是在您正在執行的操作時捕獲並過濾掉異常,同時也將其記錄在您的異常過濾器中。

通常,捕獲和處理異常的代碼負責記錄它; 這就是沒有過濾器的情況 - 頂級異常處理程序正在捕獲並記錄異常。 一旦您開始自己處理異常,您也有責任記錄它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM