扩展nlog获取我们想要的内容,比如获取代理过后的ip地址
一:自定义一个NLOG模板用来获取经过nginx转发后的ip地址
自定义一个类继承AspNetLayoutRendererBase:
using NLog;
using NLog.LayoutRenderers;
using NLog.Web.LayoutRenderers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TNBLOG.Main.NLogExtend
{
    /// <summary>
    /// 扩展nlog从nginx获取真实ip
    /// </summary>
    [LayoutRenderer("aspnet-nginx-request-ip")] 
    public class AspNetNginxRequestIpLayoutRenderer : AspNetLayoutRendererBase
    {
        protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
        {
            var httpContext = HttpContextAccessor.HttpContext;
            if (httpContext == null)
            {
                return;
            }
            string realIp = httpContext.Request.Headers["X-Real-IP"].FirstOrDefault();
            builder.Append(realIp);
        }
    }
}里边具体要怎么获取按照你自己的逻辑来就行,比如这里的httpContext.Request.Headers["X-Real-IP"].FirstOrDefault();
还有一个比较重要的就是特性LayoutRenderer用来指定模板名,比如这里的:aspnet-nginx-request-ip
如果要在模板上面使用配置可以这样使用
[LayoutRenderer("hello-universe")]
public class HelloUniverseLayoutRenderer : LayoutRenderer
{
        /// <summary>
        /// I'm not required
        /// </summary>
        public string Config1 { get; set; }
        /// <summary>
        /// I'm required! 
        /// </summary>
        [RequiredParameter]
        public string Config2 { get; set; }
        /// <summary>
        /// Hi! I'm the default parameter. You can also set me as required.
        /// </summary>
        [DefaultParameter]
        public bool Caps {get;set;}
}
增加一些属性即可,使用的时候:
${hello-universe} - Raises exception: required parameter “Config2” isn’t set。会报错因为Config2是一个必填属性
${hello-universe:Config2=abc} - OK, “Config2” property set。没有问题,我们给Config2设置了一个为abc的值
${hello-universe:true:config2=abc} - Default parameter “Caps” set to true。
${hello-universe:true:config2=abc:config1=yes} - All the three properties set。
二:注册我们自定义的扩展类
方法1:把扩展的功能放封装到一个dll中,使用<extensions />加进去即可。
比如:
<extensions> <add assembly="AJ.Extend.NLogExtend"/> </extensions>
当然可能单独封装到一个dll比较麻烦了,又不是封装很通用的东西,不需要那么麻烦可以使用下面一种方法,在当前项目注册即可。
方法2:在main方法或者startup中注入
在startup中注入,放到ConfigureServices中即可:
//增加nlog扩展
ConfigurationItemFactory.Default.LayoutRenderers.
RegisterDefinition("aspnet-nginx-request-ip", typeof(AspNetNginxRequestIpLayoutRenderer));main方法中注入:
static void Main(string[] args) 
{ 
    //layout renderer
    ConfigurationItemFactory.Default.LayoutRenderers
          .RegisterDefinition("aspnet-nginx-request-ip",typeof(AspNetNginxRequestIpLayoutRenderer));
    //target
    ConfigurationItemFactory.Default.Targets
          .RegisterDefinition("MyFirst", typeof(NLogExtend.XXX));
 
    // start logging here 
}
三:自己使用自定义的功能。所有工作都做完了,最后直接在配置文件中使用即可
代码如下:
<property name="IP" value="${aspnet-nginx-request-ip}" />