应无所住,而生其心
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

扩展nlog获取我们想要的内容,比如获取代理过后的ip地址

6418人阅读 2022/1/8 21:51 总访问:4699841 评论:0 收藏:1 手机
分类: .NET Core

一:自定义一个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}" />


欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价