我正在使用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结合使用的方法?
非常感谢!
当您在线程之间共享记录器时,可以使用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