【问题标题】:NLog inject context information c#NLog注入上下文信息c#
【发布时间】:2015-08-04 09:46:00
【问题描述】:

我正在使用 ASP.NET WebApi 和 NLog。 我想将每个请求的信息(如correlationId)添加到我的日志消息中。在最好的情况下,NLog 的用户应该对此一无所知。 Logger 本身应该能够从 http 请求中获取信息。

使用 Unity,我可以使用“PerRequestLifetimeManager”来注入这些信息,但不建议这样做。我宁愿使用 HttpContext.Items,但我对 System.Web 和 HttpContext 不满意。

是否可以根据请求范围在服务器上设置信息并在每次我想记录某些内容时将它们获取到我的记录器中?

【问题讨论】:

  • 如果你依赖于在你的类中调用 NLog 静态方法来创建记录器,那么你必须依赖 NLog API 或者做一些像注入 id 作为依赖的事情。一个更优雅的解决方案是注册一个日志拦截器,该拦截器连接到容器中的对象,并且您的对象忽略所有日志记录。

标签: c# asp.net nlog


【解决方案1】:

NLog 具有NLog.MappedDiagnosticContext,您可以使用它来创建会话类型的日志记录变量。在 ASP.Net 和 WebAPI 中,使用异步上下文,您可能需要使用 NLog.MappedDiagnosticsLogicalContext

您还需要更新目标的布局以包含此信息:

<target layout="${longdate}|${level:uppercase=true}|${logger}|[${mdc:item=SomeVariable}]${message}" >

以下是您的使用方法:

try
{
    NLog.MappedDiagnosticsLogicalContext.Set("SomeVariable", Guid.NewGuid().ToString());

    //do your work
    Log.Info("Some message here.");

    //do more work
    Log.Info("Finished!");

}
finally
{
    NLog.MappedDiagnosticsLogicalContext.Remove("SomeVariable");

}

值得注意的是,我希望看到使用 C# using 语句的更好方法来执行此操作,例如支持 log4net。

【讨论】:

    猜你喜欢
    • 2017-10-05
    • 2011-09-22
    • 2021-03-11
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多