Перенаправить ASP.NET Core Logs в определенный файл NLog асинхронно - PullRequest
1 голос
/ 10 марта 2019

Я использую NLog для входа в мой основной проект ASP.NET в отдельных файлах:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets async="true">
    <target name="JsonFile" xsi:type="File" layout="${message}" fileName="${shortdate}Json.log"/>
    <target name="ServerFile" xsi:type="File" layout="${message}" fileName="${shortdate}Server.log"/>
</targets>

<rules>
    <logger name="JsonLog" minlevel="Debug" writeTo="JsonFile" />
    <logger name="ServerLog" minlevel="Debug" writeTo="ServerFile" />
</rules>
</nlog>

-

public static class Log
{
    public static Logger Json = LogManager.GetLogger("JsonLog");
    public static Logger Server = LogManager.GetLogger("ServerLog");
}

Мои вопросы:

1. Могу ли я зарегистрировать сообщение ASP.NET Core непосредственно в конкретном ServerLog файле NLog?

2. Можно ли избежать того, что ASP.NET Core захочет синхронизироваться с консолью и просто использовать асинхронный файл ServerLog NLog для повышения производительности?Обширное ведение журнала консоли оказало существенное влияние на производительность API.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019
  1. Можно ли зарегистрировать сообщение ASP.NET Core непосредственно в конкретном файле ServerLog NLog?

У вас есть следующие опции:

  1. Inject ILogger<ServerLog>, который может быть немного хакерским, или
  2. Inject ILoggerProvider (пространство имен Microsoft.Extensions.Logging) и использовать provider.CreateLogger("ServerLog"), или
  3. UseLogManager.GetLogger("ServerLog"), хотя это подход без DI.Это может подойти для вашего проекта.
Можно ли избежать того, что ASP.NET Core захочет синхронизироваться с консолью и просто использовать асинхронный файл ServerLog NLog для повышения производительности?Расширенное ведение журнала консоли оказало существенное влияние на производительность API.

Вам действительно нужно .ClearProviders(), см. Этот пример кода:

public static IWebHostBuilder BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();  // <---------- clear console etc
            logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
        })
        .UseNLog();  // NLog: setup NLog for Dependency injection
0 голосов
/ 10 марта 2019

Вы можете добавить NLog в качестве провайдера Microsoft Extension Logging с помощью UseNLog() (И удалить консольного провайдера ASP.NET по умолчанию, вызвав ClearProviders()):

https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

Затемвы можете использовать правило подстановки (name = "*") в вашей конфигурации NLog для регистрации всех сообщений:

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

<targets async="true">
    <target name="JsonFile" xsi:type="File" layout="${message}" fileName="${shortdate}Json.log"/>
    <target name="ServerFile" xsi:type="File" layout="${longdate}|${level}|${message}${exception:format=tostring}" fileName="${shortdate}Server.log"/>
</targets>

<rules>
    <logger name="JsonLog" minlevel="Debug" writeTo="JsonFile" final="true" />
    <logger name="ServerLog" minlevel="Debug" writeTo="ServerFile" final="true" />
    <logger name="*" minlevel="Info" writeTo="ServerFile" />
</rules>
</nlog>
...