NLog如何访问RequestId?

时间:2018-07-09 15:47:34

标签: asp.net-core nlog

我想将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} 变量为空:/

3 个答案:

答案 0 :(得分:2)

我并不直接熟悉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);
    }

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:2)

您可以使用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>