如何配置nlog.config以包含asp.net core 2 web api请求自定义头信息?

时间:2018-03-11 00:45:32

标签: c# asp.net-core nlog

我有一个简单的asp.net核心web api应用程序(使用Visual Studio 2017中的默认web api模板),使用nlog将消息记录到JSON格式的控制台。

  • ASP.NET Core 2:2.0.5
  • NLog版本:4.5.0-rc07
  • NLog.Web.AspNetCore: 4.5.0-RC03

这是NLog配置文件:

 <!-- the targets to write to -->
 <targets>
    <target xsi:type="Console" name="console_log" >
      <layout xsi:type="JsonLayout">
        <attribute name="ts" layout="${date}" />
        <attribute name="level" layout="${level:upperCase=true}"/>
        **<attribute name="all-events" layout="${all-event-properties}"/>
        <attribute name="tid" layout="${aspnet-request:header=tid}"/>**
        <attribute name="cn" layout="${callsite}"/>
        <attribute name="msg" layout="${message}" />
      </layout>
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Debug" writeTo="console_log" />
  </rules>
</nlog>

在Startup.cs中,Configure方法包含以下两行:

        env.ConfigureNLog("nlog.config");
        loggerFactory.AddNLog();

我将JSON格式的日志消息输出到控制台。但是,我无法在HTTP请求标头中收到自定义标头的tid。

如何提取HTTP请求标头并将其输出到控制台?

感谢您的意见/答案/指导。谢谢。

2 个答案:

答案 0 :(得分:2)

${aspnet-request}取决于HttpContextAccessor。请更新您的代码以在IWebHostBuilder上使用UseNLog(请参阅此示例中的program.cs)

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2#4-update-programcs

UseNLog会自动注册HttpContextAccessor(请注意删除对ConfigureNLogAddNLog的任何使用,但仅使用UseNLogLogManager.LoadConfiguration作为{{1}}如上例所示)

答案 1 :(得分:0)

你可以像这样使用ActionFilterAttribute

public class HttpHeadersLogger : ActionFilterAttribute
{
    private readonly Logger _log = LogManager.GetCurrentClassLogger();

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var builder = new StringBuilder();

        builder.Append(request.RequestType + " " + request.Url + "\n");

        var logEventInfo = new LogEventInfo(LogLevel.Info, null, null);
        var parsed = HttpUtility.ParseQueryString(request.Headers.ToString());

        foreach (string key in parsed)
        {
            // Search for 'tid' header here to only log these one
            logEventInfo.Properties.Add(key, parsed[key]);
        }

        _log.Log(logEventInfo);

        base.OnActionExecuting(filterContext);
    }
}

在此示例中,正在记录所有标题,如果您只想要'tid',则应过滤该标题。 这将使用NLog布局表达式,方法是使用对象LogEventInfo来执行日志记录操作。