.NET Core 中的 NLog 事件属性

NLog EventProperties in .NET Core

我正在使用 ILogger<MyController> 通过 DI 写入日志(参见 step 6

我也在用NLog EventProperties

我想自动将 traceId 添加到我控制器中的所有日志中。

这是有效的:

logger.Info("Some log. TraceId:{traceId}", 123);

然而,我需要更改我所有的日志命令(很多!),这很痛苦。

如果我执行以下操作,则不安全:

using NLog;
public class MyController : Controller
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    public MyConstructor(Apilog apilog)
    {
        Logger.SetProperty("traceid", apilog.TraceId);
    }
}

有什么方法可以将 SetProperty 与 ILogger<MyController> 一起使用吗?

或者以某种快速且线程安全的方式将 NLog 与 SetProperty 结合使用的方法?

非常感谢!

当您在线程之间共享记录器时,您可以使用 WithProperty 来确保线程安全。

请注意,WithProperty/SetProperty 仅适用于 NLog 的 Logger。 (所以不是 Microsoft.Extensions.Logging` 的 ILogger)。见下文。

示例:

using NLog;
public class MyController : Controller
{
    private static readonly Logger BaseLogger = LogManager.GetCurrentClassLogger(); 

    private readonly Logger Logger; // non static because of traceid. 
    public MyConstructor(Apilog apilog)
    {        
        Logger = BaseLogger.WithProperty("traceid", apilog.TraceId);
    }
}

Is there some way to use SetProperty with ILogger<MyController>?

Microsoft.Extensions.Logging的ILogger接口上没有SetProperty,但是你可以这样做:

using (_logger.BeginScope(new[] { new KeyValuePair<string, object>("traceid", apilog.TraceId) }))
{
   _logger.LogDebug("Log message");
}

并在您的配置中使用:${mdlc:traceid}。查看更多详细信息和选项 here