#c# #asp.net-core #serilog #serilog-exceptions
#c# #asp.net-core #serilog #serilog-исключения
Вопрос:
Я использую SeriLog (с Loki sink), и у меня также есть Exception handler lambda
—like здесь, который улавливает все исключения, возникшие во время выполнения кода, и регистрирует их с соответствующими метками.
Но сам Serilog автоматически улавливает все необработанные исключения и регистрирует их передо мной. В результате исключение регистрируется дважды.
Как я могу отключить автоматическое ведение журнала Serilog? Это моя текущая конфигурация Serilog:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging((logging) =>
{
var log = new LoggerConfiguration()
.MinimumLevel.Debug()
.Enrich.FromLogContext()
.WriteTo.Console()
.CreateLogger();
logging.AddSerilog(log);
});
Комментарии:
1. На самом деле это не «функция автоматического ведения журнала исключений Serilog»… Вы видели инструкции , которые используют
UseSerilog
вместоAddSerilog
? Я думаю, что вы можете использовать встроенный консольный регистратор и консольный регистратор Serilog, который в конечном итоге будет вести двойные журналы.2. @KirkLarkin Спасибо, что нашли время и ответили. Я посмотрел на это сейчас, и в итоге обнаружил, что причина моего случая заключается в том, что исключение регистрируется 1) Microsoft. AspNetCore. Диагностика. ExceptionHandlerMiddleware и 2) Мое собственное промежуточное программное обеспечение. Я думаю, мне нужно отключить ExceptionHandlerMiddleware
Ответ №1:
Я следил за этой проблемой на GitHub. Проблема в том, что как мое собственное промежуточное программное обеспечение для ведения журнала, так и Microsoft.AspNetCore.Диагностика.ExceptionHandlerMiddleware регистрирует одно и то же исключение.
Решение состоит в том , чтобы отключить ExceptionHandlerMiddleware
. И я сделал это с помощью https://github.com/serilog/serilog-expressions как:
new LoggerConfiguration().Filter.ByExcluding("SourceContext <> 'Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware'")
Окончательный код:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.Loki;
namespace MyNameSpace
{
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.Filter.ByExcluding("SourceContext = 'Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware'")
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.LokiHttp(new NoAuthCredentials("http://localhost:3100"))
.CreateLogger();
try
{
Log.Information("Starting web host");
CreateHostBuilder(args).Build().Run();
return;
}
catch (Exception ex)
{
Log.Fatal(ex, "Host terminated unexpectedly");
return;
}
finally
{
Log.CloseAndFlush();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Комментарии:
1. Что эквивалентно этому в MVC5?