应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

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

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

一:自定义一个NLOG模板用来获取经过nginx转发后的ip地址

自定义一个类继承AspNetLayoutRendererBase:

  1. using NLog;
  2. using NLog.LayoutRenderers;
  3. using NLog.Web.LayoutRenderers;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace TNBLOG.Main.NLogExtend
  10. {
  11.     /// <summary>
  12.     /// 扩展nlog从nginx获取真实ip
  13.     /// </summary>
  14.     [LayoutRenderer("aspnet-nginx-request-ip")
  15.     public class AspNetNginxRequestIpLayoutRenderer : AspNetLayoutRendererBase
  16.     {
  17.         protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
  18.         {
  19.             var httpContext = HttpContextAccessor.HttpContext;
  20.             if (httpContext == null)
  21.             {
  22.                 return;
  23.             }
  24.             string realIp = httpContext.Request.Headers["X-Real-IP"].FirstOrDefault();
  25.             builder.Append(realIp);
  26.         }
  27.     }
  28. }

里边具体要怎么获取按照你自己的逻辑来就行,比如这里的httpContext.Request.Headers["X-Real-IP"].FirstOrDefault();

还有一个比较重要的就是特性LayoutRenderer用来指定模板名,比如这里的:aspnet-nginx-request-ip


如果要在模板上面使用配置可以这样使用

  1. [LayoutRenderer("hello-universe")]
  2. public class HelloUniverseLayoutRenderer : LayoutRenderer
  3. {
  4.         /// <summary>
  5.         /// I'm not required
  6.         /// </summary>
  7.         public string Config1 { getset; }
  8.         /// <summary>
  9.         /// I'm required! 
  10.         /// </summary>
  11.         [RequiredParameter]
  12.         public string Config2 { getset; }
  13.         /// <summary>
  14.         /// Hi! I'm the default parameter. You can also set me as required.
  15.         /// </summary>
  16.         [DefaultParameter]
  17.         public bool Caps {get;set;}
  18. }


增加一些属性即可,使用的时候:
${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 />加进去即可。
比如:

  1. <extensions> 
  2.   <add assembly="AJ.Extend.NLogExtend"/> 
  3. </extensions>

当然可能单独封装到一个dll比较麻烦了,又不是封装很通用的东西,不需要那么麻烦可以使用下面一种方法,在当前项目注册即可。

方法2:在main方法或者startup中注入

在startup中注入,放到ConfigureServices中即可:

  1. //增加nlog扩展
  2. ConfigurationItemFactory.Default.LayoutRenderers.
  3. RegisterDefinition("aspnet-nginx-request-ip"typeof(AspNetNginxRequestIpLayoutRenderer));

main方法中注入:

  1. static void Main(string[] args) 
  2.     //layout renderer
  3.     ConfigurationItemFactory.Default.LayoutRenderers
  4.           .RegisterDefinition("aspnet-nginx-request-ip",typeof(AspNetNginxRequestIpLayoutRenderer));
  5.     //target
  6.     ConfigurationItemFactory.Default.Targets
  7.           .RegisterDefinition("MyFirst"typeof(NLogExtend.XXX));
  8.  
  9.     // start logging here 
  10. }


三:自己使用自定义的功能。所有工作都做完了,最后直接在配置文件中使用即可

代码如下:

  1. <property name="IP" value="${aspnet-nginx-request-ip}" />


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

扩展ef自动映射需要查询的字段(表达式树Expression)动态构建返回值

Entity Framework 动态构造select表达式比如我们需要返回某些字段会采用如下的写法但是发现每次都去写select如果字段很多不...

扩展mvc实现model直接传递匿名对象

如果我们直接通过model传递匿名对象,是不行滴后台通过model传递一个匿名对象publicActionResultIndex() { returnView(ne...

根据委托和lamdba表达式扩展方法

lamdba表达式ForEach扩展方法:public static void GetForEach&lt;T&gt;(this IEnumerable&lt;T&gt; list, Action&lt;T&gt;...

表达式树+反射扩展EF实现动态排序。List动态排序

我们在显示表格的时候经常会在点击表头的时候实现排序,当然很多前端的框架都实现了当前页的页面排序,直接配置一下就行了...

推荐Visual Studio好用的扩展插件(不定时更新)

嗨咯,大家好。什么是扩展?扩展是可以允许你在 Visual Studio 中进行自定义并增强在其中的体验的附加项,通过添加新功能或...

EF扩展反射实现动态排序+表达式树

现在各种网站上的表格可以通过点击排头来实现排序例如:今天我就来一探究竟,这是怎么实现的呢?具体步骤:我通过写扩展方...

表达式树+反射+扩展方法实现动态排序效果

后台代码如下:方法1:逐个判断 --&gt;缺点:代码重复,体验感差 if(sort.ToLower()==&quot;max&quot;) { if(sortway==...

.net Core3.0在Ubuntu 16.04上面的部署(Supervisor+nginx)(扩展docker)

前 言Linux 随着Linux越来越流行,本人一个.net程序员也多次研究linux与.net的相关产品,以及中间件的使用方式。So今天给...

字符串扩展方法

获取字符串的实际长度(按单字节) publicstaticintGetRealLength(thisstringsource) { returnSystem.Text.Encoding.Defau...

验证合法性扩展方法

Email格式是否合法 publicstaticboolIsEmail(thisstringsource) { returnRegex.IsMatch(source,@&quot;^\w+((-\w+)|(\.\...

扩展markdown增加mermaid支持画图

我看网上没有什么资料,只有说怎么去用它,没有说怎么才能用它。那就自己慢慢研究在让markdown支持,要自己实现这个必须要...

c扩展方法简单介绍

可以不用继承就可以给一个类增加方法!语法: Public static class 类名 { //你想添加的扩展方法 Public static ...

list扩展方法ForEach原理(whereFirstOrDefault同理!)

//ForEach的原理就是使用循环 //委托使用循环 publicstaticvoidMyForEach&lt;T&gt;(thisList&lt;T&gt;item,Action&lt;T...

特性扩展实体对象验证、枚举验证值是否正确

如果实体属性字段过多,几十,上百个,如果我们每个字段都去判断的话很麻,代码量很大,我们可以采用特性加枚举进行验证:1、...

Mybatis的SQL构建7 小小扩展+springboot

pom.xml的依赖,我是直接在spring.io官方下的,这样避免依赖冲突&lt;!--jdbc--&gt; &lt;dependency&gt; &lt;groupId&gt;o...

nlog扩展官方文档

https://nlog-project.org/2015/06/30/extending-nlog-is-easy.html