我想为 .NET Core 8 创建一个全局错误处理程序。
这是代码:
public class ExceptionHandlingMiddleware : IExceptionHandler
{
private readonly ILogger<ExceptionHandlingMiddleware> _logger;
public ExceptionHandlingMiddleware(ILogger<ExceptionHandlingMiddleware> logger)
{
_logger = logger;
//work in file, console and MSSQL-Db
_logger.LogInformation("1-ExceptionHandlingMiddleware");
}
public ValueTask<bool> TryHandleAsync(HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
//work in file, console but not in MSSQL-Db!!
_logger.LogInformation("2-ExceptionHandlingMiddleware");
return ValueTask.FromResult(false);
}
}
程序.cs:
builder.Services.AddExceptionHandler<ExceptionHandlingMiddleware>();
app.UseExceptionHandler();
Serilog 记录器配置为将日志写入文件、控制台和 SQL Server 数据库。它在应用程序的各个部分都运行良好,并且处理程序被正确调用并记录在构造函数中。但是,记录到数据库在
TryHandleAsync
方法中不起作用,尽管它可以在文件和控制台日志记录中工作。记录到数据库在应用程序的其他部分工作正常,但在这个特定位置则不行。有什么想法吗?
var sinkOpts = new MSSqlServerSinkOptions();
sinkOpts.TableName = "_GlobalErrorLog";
sinkOpts.AutoCreateSqlTable = true;
var columnOpts = new ColumnOptions();
columnOpts.Store.Add(StandardColumn.LogEvent);
columnOpts.LogEvent.DataLength = 4000;
我发现了错误。首先我的代码:
columnOpts.LogEvent.DataLength = 2000;
我只是为了好玩把它改成最大长度4000:
columnOpts.LogEvent.DataLength = 4000;
有效。