在 serilog-timings 中记录 "begin" 事件

Logging the "begin" event in serilog-timings

Nicholas Blumhardt 的 Serilog timigs (or on the GitHub: serilog-timings) 是一个方便的工具,用于记录不同操作的持续时间。但是 - 至少据我所知 - 它设计用于仅在操作结束时进行记录(通过 Operation.Complete() 方法,或者由于异常而退出 using{} 块。由于嵌套操作结束于与开始顺序相反,当我们记录开始时,记录嵌套操作会更清楚。我想获得类似的日志项,可以通过以下代码实现:

    using (var op = Operation.Begin("ended {OperationID}, {OperationName}, {User}", 123, "Main operation", "Benny Hill"))
    {
        Log.Information("started  {OperationID}, {OperationName}, {User}", 123, "Main operation", "Benny Hill");
        Log.Information("... some other log items....");
        op.Complete("Returned", 1230);
    }

,即结果应该是这样的:

不幸的是,上面的代码不太方便,因为必须将相同的属性赋予 Log.Informatrion(),而这些属性已经赋予 Operation.Begin()。在 Operation.Complete 以外的其他地方是否已经有使用这些参数的解决方案,或者我应该在 serilog-timings 中添加一个新方法(例如 Operaton.LogStart())?

SerilogTimings 不提供此功能,但您可以将其包装在您自己的扩展程序中:

using Serilog;
using SerilogTimings;
using SerilogTimings.Extensions;

class OperationEx
{
    public static Operation Begin(string messageTemplate, params object[] args)
    {
        var op = Log.Logger.BeginOperation(messageTemplate, args);
        Log.Logger.Information($"{messageTemplate} started", args);            
        return op;
    }
}

(基于您的 PR 中的代码。)

然后在您的应用中:

using var op = OperationEx.Begin("Adding {Count} successive integers", count));
// .. as before