。NET Core中的NLog事件属性

问题描述 投票:1回答:1

我正在使用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);
    }
}

是否可以通过ILogger<MyController>使用SetProperty?

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

非常感谢!

c# .net asp.net-core nlog ms-extensions-logging
1个回答
0
投票

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

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);
    }
}

是否可以通过ILogger<MyController>使用SetProperty?

该接口上没有SetProperty,但是您可以这样做:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.