【问题标题】:Redirect ASP.NET Core Logs to a specific NLog file asynchronous将 ASP.NET Core 日志异步重定向到特定的 NLog 文件
【发布时间】:2019-03-10 10:06:23
【问题描述】:

我使用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的消息直接记录到NLog的具体ServerLog文件中吗?

2. 我是否可以避免 ASP.NET Core 想要同步登录到控制台,而只使用 NLog 的异步 ServerLog 文件以获得更好的性能?广泛的控制台日志记录对 API 的性能产生了巨大的影响。

【问题讨论】:

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


    【解决方案1】:

    您可以使用UseNLog() 将 NLog 添加为 Microsoft 扩展日志记录提供程序(并通过调用 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>
    

    【讨论】:

      【解决方案2】:
      1. 能否将ASP.NET Core的消息直接记录到NLog的特定ServerLog文件中?

      您有以下选择:

      1. 注入ILogger&lt;ServerLog&gt;,这可能有点hacky,或者
      2. 注入ILoggerProvider(命名空间Microsoft.Extensions.Logging)并使用provider.CreateLogger("ServerLog"),或者
      3. 使用LogManager.GetLogger("ServerLog"),尽管这是非DI 方法。它可能适合您的项目。
      1. 能否避免 ASP.NET Core 想要同步登录到控制台,而只使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 1970-01-01
        • 2018-02-16
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        相关资源
        最近更新 更多