将ASP.NET Core日志重定向到异步的特定NLog文件

时间:2019-03-10 10:06:23

标签: c# logging asp.net-core nlog

我使用NLog在单独的文件中登录ASP.NET Core项目:

<?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 :(得分:0)

您可以使用UseNLog()将NLog添加为Microsoft Extension Logging提供程序(并通过调用ClearProviders()来删除默认的ASP.NET控制台提供程序):

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

然后,您可以在NLog-config中使用通配符规则(name =“ *”)以进行全部记录:

<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>

答案 1 :(得分:0)

  
      
  1. 是否可以将ASP.NET Core的消息直接记录到NLog的特定ServerLog文件中?
  2.   

您有以下选择:

  1. 注入ILogger<ServerLog>,这可能有点怪异,或者
  2. 注入ILoggerProvider(Microsoft.Extensions.Logging命名空间)并使用provider.CreateLogger("ServerLog"),或
  3. 使用LogManager.GetLogger("ServerLog"),尽管这是非DI方法。它可能适合您的项目。
  
      
  1. 是否可以避免ASP.NET Core想要同步登录到控制台,而仅使用NLog的异步ServerLog文件来获得更好的性能?大量的控制台日志记录对API的性能产生了巨大影响。
  2.   

您确实需要.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