Net Core NLog.Web“aspnet-request:header”属性用法?

时间:2016-11-22 10:28:18

标签: asp.net-core-mvc nlog

有没有办法使用带有一个参数的“aspnet-request:header”属性记录所有标题?或者我应该像“aspnet-request:header = MyHeader”一样逐个获取标题,并在插入之前将它们组合成一个参数?我有很多标题,不想单独添加它们,如果可能的话,我需要快速记录它们。

1 个答案:

答案 0 :(得分:1)

目前只支持一个标头,因为它调用

string header = httpRequest.Headers[this.Header]; see source

编辑:您可以将其插入NLog,如下所示:

using System;
using System.Text;
using Microsoft.AspNetCore.Http;
using NLog.Config;
using NLog.LayoutRenderers;
using NLog.Web.Internal;

namespace NLog.Web.LayoutRenderers
{
    /// <summary>
    /// Render all headers for ASP.NET Core
    /// </summary>
    /// <example>
    /// <code lang="NLog Layout Renderer">
    /// ${aspnet-request-all-headers}
    /// </code>
    /// </example>
    [LayoutRenderer("aspnet-request-all-headers")]
    public class AspNetRequestAllHeadersLayoutRenderer : AspNetLayoutRendererBase
    {


        protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
        {
            var httpRequest = HttpContextAccessor.HttpContext.TryGetRequest();
            if (httpRequest == null || httpRequest.Headers == null)
            {
                return;
            }
            foreach(var kpv in httpRequest.Headers)
            {

                if (header != null)
                {
                    builder.Append(kpv.Key);
                    builder.Append(=);
                    builder.Append(kpv.Value);
                }
            }

        }
    }
}

注册(startup.cs)

    ConfigurationItemFactory.Default.LayoutRenderers
                        .RegisterDefinition("aspnet-request-all-headers", typeof(AspNetRequestAllHeadersLayoutRenderer  ));

另见Extending NLog

使用

 ${aspnet-request-all-headers}