Serilog 不要在 IExceptionHandler (.NET 8) 中写入数据库

问题描述 投票:0回答:1

我想为 .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
方法中不起作用,尽管它可以在文件和控制台日志记录中工作。记录到数据库在应用程序的其他部分工作正常,但在这个特定位置则不行。有什么想法吗?

.net-core serilog .net-8.0 exceptionhandler
1个回答
0
投票
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;  

有效。

© www.soinside.com 2019 - 2024. All rights reserved.