NLog如何获取RequestId?

NLog how to access RequestId?

我想将 Activity.Current?.Id ?? HttpContext.TraceIdentifier 保存到数据库中,因为这是用户在默认错误视图中看到的请求 ID。但是怎么办? HttpContext 在 startup.cs 中不可用,我尝试在 LayoutRenderer 中访问 HttpContext 未成功。

HomeController 中的错误方法

public IActionResult Error()
{
    var model = new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier };

    return View(model);
}

我试过 LayoutRenderer

namespace Copacking.Web.Utils
{
    [LayoutRenderer("requestid")]
    public class NLogRequestIdLayoutRenderer : LayoutRenderer
    {
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            builder.Append(Activity.Current?.Id ?? HttpContext.TraceIdentifier);
        }
    }
}

但是 HttpContext 出现错误,因为需要对象引用。

我该如何解决?在 Nlog.config 文件中 ${aspnet-traceidentifier} 正在工作,但 ${activityid}变量为空:/

我并不直接熟悉 NLog,所以如果我在这里遗漏了什么,请原谅我,但在真正抽象的日志记录设置中,您不应该真的有任何硬性的 NLog 依赖关系,无论如何。理想情况下,您应该使用 Microsoft.Extensions.Logging 之类的东西,并将 NLog 作为提供者简单地插入其中。

然后,从控制器的角度来看,您只需注入您的记录器,然后直接在那里记录:

public class ErrorController : Controller
{
    private readonly ILoggerFactory _loggerFactory;

    public ErrorController(ILoggerFactory loggerFactory)
    {
        _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
    }

    public IActionResult Error()
    {
        var feature = HttpContext.Features.Get<IExceptionHandlerFeature>();
        var logger = _loggerFactory.CreateLogger(feature.Error.TargetSite.DeclaringType);
        logger.LogError(feature.Error, "{RequestId} {ErrorMessage}", new
        {
            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier,
            ErrorMessage = feature.Error.Message
         });

         var model = new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier };

         return View(model);
    }

How can i solve it ? In Nlog.config file ${aspnet-traceidentifier} is working but ${activityid} variable is empty :/

根据 NLog wiki ${Activity}Trace.CorrelationManager.ActivityId 中获取值。您尝试在请求开始时分配一个值。

if(System.Diagnostics.Trace.CorrelationManager.ActivityId.Equals(Guid.Empty))
   System.Diagnostics.Trace.CorrelationManager.ActivityId = Guid.NewGuid();

您可以使用 https://www.nuget.org/packages/NLog.Web.AspNetCore 执行以下操作:

layout="${activityid:whenEmpty=${mdlc:item=RequestId:whenEmpty=${aspnet-TraceIdentifier}}}"

记得在 NLog.config 中包含以下内容:

<extensions>
  <add assembly="NLog.Web.AspNetCore"/>
</extensions>