Nlog Log IP-адрес из проекта библиотеки NetCore - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть решение VS 2017 с несколькими проектами, у меня есть отдельный проект с методами NLog, чтобы использовать его из других проектов, чтобы не включать NLog во все проекты.

  • NetCore Rest API
  • Инфраструктура NetCore
  • База данных NetCore и постоянство
  • NetCore Logger
  • Другие проекты NetStandard с помощниками и классами ViewModel

Я хочу регистрировать IP-адрес клиента и пользователя, если он вошел в систему. Я видел, что мне нужно использовать шаблон в файле NLog.config, но он не работает, и поле IPAddress журнала пусто.

Как правильно это сделать?

NLog.Config

<extensions>    
  <add assembly="NLog.Web.AspNetCore"/>
</extensions>

<targets>
  <target name="Database" xsi:type="Database">
    <commandText>
      INSERT INTO T_LOG
        (DATE_, APP, IPADDRESS, USER_, CENTRE, LEVEL_, LOGGER,
        METHOD, MESSAGE, EXCEPTION,
        SOURCE_FILE_PATH, LINE_NUMBER)
      VALUES(
        @Date, @App, @IPAddr, @User, @Centre, @Level, @Logger,
        @Method, @Message, @Exception,
        @SourceFilePath, @LineNumber);
    </commandText>

    <parameter name="@App" layout="${AppName}" />
    <parameter name="@IPAddr" layout="${aspnet-request-ip}" />
    <parameter name="@User" layout="" />
    <parameter name="@Centre" layout="" />
    <parameter name="@Date" layout="${longdate}" />
    <parameter name="@Level" layout="${level:upperCase=true}"/>
    <parameter name="@Logger" layout="${logger:shortName=false}"/>
    <parameter name="@Method" layout="${event-context:item=callermember}"/>
    <parameter name="@Message" layout="${message}" />
    <parameter name="@Exception" layout="${exception:format=ToString}"/>
    <parameter name="@SourceFilePath" layout="${event-context:item=callerpath}" />
    <parameter name="@LineNumber" layout="${event-context:item=callerline}" />

</target>

Logger Class

using Microsoft.AspNetCore.Http;
using NLog;
using System;
using System.Runtime.CompilerServices;

namespace Project.Log
{
    public class CustomLogger
    {
        private readonly Logger logger;
        private Type type;

        public RhesusLog(Type type)
        {
            this.type = type;
            this.logger = LogManager.GetLogger(type.FullName);
        }

        public void Debug(string msg, Exception ex = null,
            [CallerFilePath] string CallerPath = "",
            [CallerMemberName] string CallerMember = "",
            [CallerLineNumber] int CallerLine = 0, params object[] args)
        {
            this.Log(LogLevel.Debug, msg, ex, CallerPath, CallerMember, CallerLine);
        }

        public void Info(string msg, Exception ex = null,
            [CallerFilePath] string CallerPath = "",
            [CallerMemberName] string CallerMember = "",
            [CallerLineNumber] int CallerLine = 0)
        {
            this.Log(LogLevel.Info, msg, ex, CallerPath, CallerMember, CallerLine);
        }

        // Other Levels logs ....

        private void Log(LogLevel Level, string msg,
            Exception Exception = null, string CallerPath = "",
            string CallerMember = "", int CallerLine = 0, params object[] parameters)
        {
            LogEventInfo LogEvent = new LogEventInfo(Level, this.type.FullName, msg);
            LogEvent.Parameters = parameters;
            LogEvent.Exception = Exception;
            LogEvent.Properties.Add("callerpath", CallerPath);
            LogEvent.Properties.Add("callermember", CallerMember);
            LogEvent.Properties.Add("callerline", CallerLine);

            this.logger.Log(LogEvent);
        }
    }
}

Я использовал журнал NLog и вижу это сообщение в журнале

2018-09-06 23:31:44.6183 Debug Setting 'DatabaseParameterInfo.layout' to '${aspnet-request-ip}'
2018-09-06 23:31:44.6183 Debug Missing serviceProvider, so no HttpContext

1 Ответ

0 голосов
/ 08 сентября 2018

Если NLog регистрирует «Отсутствует serviceProvider, поэтому нет HttpContext», serviceProvider не будет правильно зарегистрирован в NLog.

UseNLog() на IWebHostBuilder зарегистрирует ServiceProvider и добавит HttpContextAccessor в систему DI.

Так что вам следует дважды проверить, правильно ли вы вызываете UseNLog (), см. Этот пример program.cs:

public static void Main(string[] args)
{
    // NLog: setup the logger first to catch all errors
    var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    try
    {
        logger.Debug("init main");
        BuildWebHost(args).Run(); 
    }
    catch (Exception ex)
    {
        //NLog: catch setup errors
        logger.Error(ex, "Stopped program because of exception");
        throw;
    }
    finally
    {
        // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
        NLog.LogManager.Shutdown();
    }
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
        })
        .UseNLog()  // NLog: setup NLog for Dependency injection
        .Build();

См. Также https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

...