gpt4 book ai didi

c# - .NET Core 中的 NLog 事件属性

转载 作者:行者123 更新时间:2023-12-04 10:34:49 24 4
gpt4 key购买 nike

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

我也在使用 NLog EventProperties

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

这是有效的:

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 仅在 Logger 上可用。 NLog 的。 (所以不是 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 接口(interface)上没有 SetProperty,但您可以这样做:

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

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

关于c# - .NET Core 中的 NLog 事件属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60235107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com