如果 asp.net 核心中的异步日志记录失败,则调用操作
invoke an action if asynchronous logging is failed in asp.net core
我有一个要求,如果数据库日志记录失败,我想将日志写入文件。这里的想法是再次通过 运行 一些批处理将这些记录从文件插入回数据库。
我正在使用中间件方法将 request/response/exceptions 记录到数据库。
public async Task InvokeAsync(HttpContext context)
{
//execute request and get response
try{
_logger.LogDebug("{database logging template}", log.Request, log.Response, log.Exception);
}
catch(Exception ex){
//Log to file ---> _logger.LogDebug();
}
}
我的 serilog 配置如下所示
.WriteTo.MSSqlServer(
connectionString: config.GetConnectionString("DB"),
sinkOptions: new SinkOptions { TableName = "LogTable", AutoCreateSqlTable = true },
columnOptions: columnOptions));
我不确定在不阻止 HTTP 请求的情况下,如何检查 _logger.LogDebug
是否成功执行,如果没有,请继续 catch
将日志写入文件。
我可以在 serilog 中使用 .AuditTo
,但这会使日志记录同步,因此会阻止 HTTP 响应。
有什么建议吗?
Serilog 当前没有允许您在异步日志写入失败时捕获错误的功能,因此 .AuditTo
将是唯一可靠的开箱即用选项,缺点是调用如您所述变得同步。
为了做你想做的事 和 仍然保持写入异步,你必须创建你自己的 Serilog.Sinks.MSSqlServer
版本并在那里处理错误或公开它们到您的调用代码。
您可以做的另一件事是启用 SelfLog 并尝试将错误消息写入更可靠的接收器,这样您就可以收到调用失败的警报。它不会给你写失败的原始消息,但至少你可以在发生异常时得到通知。
我有一个要求,如果数据库日志记录失败,我想将日志写入文件。这里的想法是再次通过 运行 一些批处理将这些记录从文件插入回数据库。
我正在使用中间件方法将 request/response/exceptions 记录到数据库。
public async Task InvokeAsync(HttpContext context)
{
//execute request and get response
try{
_logger.LogDebug("{database logging template}", log.Request, log.Response, log.Exception);
}
catch(Exception ex){
//Log to file ---> _logger.LogDebug();
}
}
我的 serilog 配置如下所示
.WriteTo.MSSqlServer(
connectionString: config.GetConnectionString("DB"),
sinkOptions: new SinkOptions { TableName = "LogTable", AutoCreateSqlTable = true },
columnOptions: columnOptions));
我不确定在不阻止 HTTP 请求的情况下,如何检查 _logger.LogDebug
是否成功执行,如果没有,请继续 catch
将日志写入文件。
我可以在 serilog 中使用 .AuditTo
,但这会使日志记录同步,因此会阻止 HTTP 响应。
有什么建议吗?
Serilog 当前没有允许您在异步日志写入失败时捕获错误的功能,因此 .AuditTo
将是唯一可靠的开箱即用选项,缺点是调用如您所述变得同步。
为了做你想做的事 和 仍然保持写入异步,你必须创建你自己的 Serilog.Sinks.MSSqlServer
版本并在那里处理错误或公开它们到您的调用代码。
您可以做的另一件事是启用 SelfLog 并尝试将错误消息写入更可靠的接收器,这样您就可以收到调用失败的警报。它不会给你写失败的原始消息,但至少你可以在发生异常时得到通知。