我正在使用Serilog作为我的日志框架(Seq作为我的日志接收器).记录异常时,我使用的是:
log.Error(ex, "Operation Failed");
我的应用程序大量使用async / await方法.当发生未处理的异常时,堆栈跟踪很难读取.有一个nuget包可以清理异步堆栈跟踪(https://github.com/aelij/AsyncFriendlyStackTrace).这将创建一个扩展方法,使您可以访问已修改/清除的堆栈跟踪:
ex.ToAsyncString()
我希望能够使用此库在写入Seq之前拦截堆栈跟踪,而是记录清理/修改的堆栈跟踪.
是否有一种方法可以使用Serilog / Seq来控制发送到日志接收器的错误字符串的确切输出?
解决方法:
也许enrichment在这里可能会有所帮助.虽然未在该链接中进行具体讨论,但您可以构建自定义更容器:
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之前拦截并修改/添加/删除事件的属性.