.net core NLog自定义Renderer/自定义输出字段

参考文章1:如何自定义Rander

参考文章2:注册自定义组件

一、添加固定指定

1、定义组件代码

[LayoutRenderer("hello-world")]
public class HelloWorldLayoutRenderer : LayoutRenderer
{
    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        builder.Append("hello world!");
    }
}

2、nlog配置文件引入程序集名称

<nlog> 
  <extensions> 
    <add assembly="MyAssembly"/> 
  </extensions> 

3、nlog配置文件中添加配置

将${hello-world}写入配置文件即可

二、如果想将http请求中参数写入该怎么办呢?

1、定义组件代码,这里是参考源码写的。这里是记录每个请求的token,httpContext都能拿到,其他就可以为所欲为了


    [LayoutRenderer("aspnet-token")]
    public class AspNetRequestMachineNoLayoutRenderer : AspNetLayoutRendererBase
    {
       
        [DefaultValue("token")]
        public Layout ForwardedForHeader { get; set; } = "token";
        
        protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
        {
            var httpContext = HttpContextAccessor.HttpContext;

            var request = httpContext?.Request;
            if (request == null)
            {
                return;
            }

            var machineNo = ForwardedForHeader != null ? TryLookupForwardHeader(request, logEvent) : string.Empty;

            builder.Append(token);
        }

        private string TryLookupForwardHeader(Microsoft.AspNetCore.Http.HttpRequest httpRequest, LogEventInfo logEvent)
        {
            var headerName = ForwardedForHeader.Render(logEvent);
            if (httpRequest.Headers?.ContainsKey(headerName) == true)
            {
                var forwardedHeaders = httpRequest.Headers.GetCommaSeparatedValues(headerName);
                if (forwardedHeaders.Length > 0)
                {
                    return forwardedHeaders[0];
                }
            }

            return string.Empty;
        }
    }


版权声明:本文为weirtang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。