代码之家  ›  专栏  ›  技术社区  ›  Muflix

nlog如何访问requestid?

  •  1
  • Muflix  · 技术社区  · 6 年前

    我想保存 Activity.Current?.Id ?? HttpContext.TraceIdentifier 进入数据库,因为这是用户在默认错误视图中看到的请求ID。但是怎么做呢? 请求上下文 在startup.cs中不可用,我尝试在中访问httpcontext 布局渲染器 没有成功。

    家庭控制器中的错误方法

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

    我尝试了布局渲染器

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

    但是我有个错误 请求上下文 ,因为需要对象引用。

    我怎么解决?在 nlog.config配置 文件 $aspnet traceidentifier_ 正在工作,但是 $活动ID 变量为空:/

    3 回复  |  直到 6 年前
        1
  •  2
  •   Chris Pratt    6 年前

    我对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);
        }
    
        2
  •  2
  •   Jawahar    6 年前

    我怎么解决?在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();
    
        3
  •  2
  •   Rolf Kristensen Raúl Diego    6 年前

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