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

问题描述 投票:1回答:2

我使用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想要同步登录到Console并只使用ServerLog的异步NLog文件以获得更好的性能吗?广泛的控制台日志记录对API的性能产生了巨大影响。

c# logging asp.net-core nlog
2个回答
0
投票

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

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

然后你可以使用通配符规则(name =“*”)到你的NLog-config来进行全能日志记录:

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

0
投票
  1. 我可以将ASP.NET Core的消息直接记录到NLog的特定ServerLog文件中吗?

您有以下选择:

  1. 注入ILogger<ServerLog>,这可能有点hacky,或
  2. 注入ILoggerProvider(名称空间Microsoft.Extensions.Logging)并使用provider.CreateLogger("ServerLog"),或者
  3. 使用LogManager.GetLogger("ServerLog"),虽然这是非DI方法。它可能适合您的项目。
  1. 我可以避免ASP.NET Core想要同步登录到Console并只使用NLog的异步ServerLog文件以获得更好的性能吗?广泛的控制台日志记录对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
© www.soinside.com 2019 - 2024. All rights reserved.