如何配置NLog以获取IP地址.NET Core

时间:2016-11-24 12:16:48

标签: asp.net-core nlog

我开发.net核心应用程序并使用 NLog 作为日志框架。

如何设置NLog布局以获取远程IP地址?

不幸的是, NLog.Web.AspNetCore 不支持${aspnet-request.serverVariable=remote_addr}

可能我可以以某种方式访问​​httpContext.Connection.RemoteIpAddress

4 个答案:

答案 0 :(得分:9)

自NLog.Web.AspNetCore 4.4.0起支持此功能。

  1. 安装包 NLog.Web.AspNetCore
  2. 在您的配置中设置

    <!-- enable asp.net core layout renderers -->
    <extensions>
      <add assembly="NLog.Web.AspNetCore"/>
    </extensions>
    
  3. 您现在可以在配置中使用${aspnet-request-ip}

  4. 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));
    

    另见Extending NLog

    使用

    ${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();
}