5

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

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

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

ex.ToAsyncString()

我希望能够在将堆栈跟踪写入 Seq 之前使用此库来拦截堆栈跟踪,而是记录干净/修改后的堆栈跟踪。

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

4

1 回答 1

7

也许浓缩在这里可能会有所帮助。虽然该链接中没有具体讨论,但您可以构建自定义浓缩器:

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 之前拦截和修改/添加/删除事件的属性。

于 2016-09-17T00:01:36.053 回答