private static IDisposable Measure <T>(this ISemanticLog log, SemanticLogLevel logLevel, T context, LogFormatter <T> action) { var watch = ValueStopwatch.StartNew(); return(new DelegateDisposable(() => { var elapsedMs = watch.Stop(); log.Log(logLevel, (Context: context, elapsedMs), null, (ctx, w) => { action?.Invoke(ctx.Context, w); w.WriteProperty("elapsedMs", elapsedMs); }); })); }