如何使用 serilog 自定义异常输出

How to customize exception output using serilog

我使用 Serilog 作为我的日志记录框架(使用 Seq 作为我的日志接收器)。当记录异常时,我使用类似的东西:

log.Error(ex, "Operation Failed");

我的应用程序大量使用 async/await 方法。当发生未处理的异常时,堆栈跟踪非常难以阅读。有一个 nuget 包可以清理异步堆栈跟踪 (https://github.com/aelij/AsyncFriendlyStackTrace)。这将创建一个扩展方法,让您可以访问 modified/clean 堆栈跟踪:

ex.ToAsyncString()

我希望能够在将堆栈跟踪写入 Seq 之前使用此库拦截堆栈跟踪,而不是记录 clean/modified 堆栈跟踪。

有没有办法 Serilog/Seq 控制发送到日志接收器的错误字符串的准确输出?

也许 enrichment 对您有帮助。虽然在 link 中没有具体讨论,但您可以构建自定义增强器:

public class ExceptionEnricher : ILogEventEnricher
{
    public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
    {
        if (logEvent.Exception != null)
        {
            // do something here

            propertyFactory.CreateProperty("ExtraExceptionDetail", extraDetail);
        }
    }
}

然后...

var loggerConfig = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Seq(url)
    .Enrich.With<ExceptionEnricher>()
    .Enrich.FromLogContext();

我对您引用的包没有任何经验,但是这种方法可以让您在事件写入 Seq 之前拦截事件的 modify/add/remove 属性。