How to configure NLog to get IP address .NET Core

眉间皱痕 提交于 2019-12-07 00:37:58

问题


I develop .net core app and use NLog as logging framework.

How can I setup NLog layout to get remote IP address?

Unfortunately, ${aspnet-request.serverVariable=remote_addr} isn't supported by NLog.Web.AspNetCore.

May be I can get access to httpContext.Connection.RemoteIpAddress somehow.


回答1:


This is supported since NLog.Web.AspNetCore 4.4.0.

  1. Install the package NLog.Web.AspNetCore
  2. Set in your config

    <!-- enable asp.net core layout renderers -->
    <extensions>
      <add assembly="NLog.Web.AspNetCore"/>
    </extensions>
    
  3. You could now use ${aspnet-request-ip} in your config.

PS: also supported for ASP.NET in NLog.Web 4.5.0

Old answer

Currently this is not supported, but you could inject it in NLog like this:

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);
        }
    }
}

Register it (startup.cs)

ConfigurationItemFactory.Default.LayoutRenderers
    .RegisterDefinition("aspnet-request-ip", typeof(AspNetRequestIpLayoutRenderer));

See also Extending NLog

usage

${aspnet-request-ip}

Also include NLog.Web.AspNetCore!




回答2:


It is now easier: Introduced in NLog Web.AspNetCore 4.4.0 & NLog.Web 4.5.0

Render Client IP address

Supported in ASP.NET & ASP.NET Core.

Configuration Syntax

${aspnet-request-ip}

Nothing else is needed




回答3:


A simpler solution might be to use NLog's Global Diagnostics Context option.

For example, set a custom value named "IpAddress" before logging an event:

 public IActionResult AnAction()
 {
     NLog.GlobalDiagnosticsContext.Set("IpAddress", HttpContext.Connection.RemoteIpAddress);
     _logger.LogInformation("Something happened");
     return View();
 }

And in your nlog.config file, you can make use of that value in the layout like this:

<target xsi:type="File" name="allfile" fileName="c:\nlog.log" 
    layout="${longdate} | ${message} | ${gdc:item=IpAddress}" />


来源:https://stackoverflow.com/questions/40786220/how-to-configure-nlog-to-get-ip-address-net-core

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!