添加自定义 ExceptionFilter 后,Serilog 会立即停止记录异常
Serilog stops logging exceptions as soon as I add a custom ExceptionFilter
我已将 Serilog 添加到我的项目中:
Program.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 错误:
Startup.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?
对我哪里出错有什么建议吗?
在这里,你最好的选择是像你在这里做的那样捕获并过滤掉异常,但也将它记录在你的异常过滤器中。
通常捕获和处理异常的代码负责记录它;这就是没有过滤器时发生的情况——顶级异常处理程序正在捕获并记录异常。一旦您开始自己处理异常,您还要负责记录它。
我已将 Serilog 添加到我的项目中:
Program.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 错误:
Startup.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?
对我哪里出错有什么建议吗?
在这里,你最好的选择是像你在这里做的那样捕获并过滤掉异常,但也将它记录在你的异常过滤器中。
通常捕获和处理异常的代码负责记录它;这就是没有过滤器时发生的情况——顶级异常处理程序正在捕获并记录异常。一旦您开始自己处理异常,您还要负责记录它。