扩展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}" />