


一:自定义一个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}" />
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)