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