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