如何禁用 Serilog 的自动异常记录功能?
How can I disable Serilog's automatic exception logging feature?
我正在使用 SeriLog(带有 Loki sink),我还有一个 Exception handler lambda
-like in here,它捕获代码执行期间发生的所有异常并使用适当的标签记录它们。
但是,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);
});
我关注了this GitHub issue。问题是,我自己的日志记录中间件和 Microsoft.AspNetCore.Diagnostics.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>();
});
}
}
我正在使用 SeriLog(带有 Loki sink),我还有一个 Exception handler lambda
-like in here,它捕获代码执行期间发生的所有异常并使用适当的标签记录它们。
但是,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);
});
我关注了this GitHub issue。问题是,我自己的日志记录中间件和 Microsoft.AspNetCore.Diagnostics.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>();
});
}
}