我开发.net核心应用程序并使用 NLog 作为日志框架。
如何设置NLog布局以获取远程IP地址?
不幸的是, NLog.Web.AspNetCore 不支持${aspnet-request.serverVariable=remote_addr}
。
可能我可以以某种方式访问httpContext.Connection.RemoteIpAddress
。
答案 0 :(得分:9)
自NLog.Web.AspNetCore 4.4.0起支持此功能。
在您的配置中设置
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
您现在可以在配置中使用${aspnet-request-ip}
。
PS:NLog.Web 4.5.0中也支持ASP.NET
目前不支持此功能,但您可以将其注入NLog,如下所示:
using System;
using System.Text;
using Microsoft.AspNetCore.Http;
using NLog.Config;
using NLog.LayoutRenderers;
using NLog.Web.Internal;
namespace NLog.Web.LayoutRenderers
{
/// <summary>
/// Render the request IP for ASP.NET Core
/// </summary>
/// <example>
/// <code lang="NLog Layout Renderer">
/// ${aspnet-request-ip}
/// </code>
/// </example>
[LayoutRenderer("aspnet-request-ip")]
public class AspNetRequestIpLayoutRenderer : AspNetLayoutRendererBase
{
protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
{
var httpContext = HttpContextAccessor.HttpContext;
if (httpContext == null)
{
return;
}
builder.Append(httpContext.Connection.RemoteIpAddress);
}
}
}
注册(startup.cs)
ConfigurationItemFactory.Default.LayoutRenderers
.RegisterDefinition("aspnet-request-ip", typeof(AspNetRequestIpLayoutRenderer));
使用
${aspnet-request-ip}
还包括NLog.Web.AspNetCore!
答案 1 :(得分:0)
更简单的解决方案可能是使用NLog的Global Diagnostics Context选项。
例如,设置名为&#34; IpAddress&#34;的自定义值。在记录事件之前:
public IActionResult AnAction()
{
NLog.GlobalDiagnosticsContext.Set("IpAddress", HttpContext.Connection.RemoteIpAddress);
_logger.LogInformation("Something happened");
return View();
}
在你的nlog.config文件中,你可以在布局中使用这个值,如下所示:
<target xsi:type="File" name="allfile" fileName="c:\nlog.log"
layout="${longdate} | ${message} | ${gdc:item=IpAddress}" />
答案 2 :(得分:0)
现在更容易: 在NLog Web.AspNetCore 4.4.0&amp; NLog.Web 4.5.0
渲染客户端IP地址
支持ASP.NET&amp; ASP.NET核心。
配置语法
$ {ASPNET请求-IP}
不需要其他任何东西
答案 3 :(得分:0)
还需要在.NLog()
之前调用.Build()
。
类似这样的东西:
public static void Main(string[] args)
{
CreateWebHostBuilder(args).UseNLog().Build().Run();
}