1. 程式人生 > 實用技巧 >如何使用第三方日誌記錄提供程式替代.NET Core中的內建程式

如何使用第三方日誌記錄提供程式替代.NET Core中的內建程式

.NET Core 支援適用於各種內建和第三方日誌記錄提供程式的日誌記錄 API。先來看下如何將日誌記錄 API 與內建提供程式一起使用。

呼叫 CreateDefaultBuilder,這將新增以下日誌記錄提供程式:

  • 控制檯

  • 除錯

  • EventSource

  • EventLog:僅限 Windows

  • public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static
    IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }

    若要替代Host.CreateDefaultBuilder 新增的預設日誌記錄提供程式集,請呼叫 ClearProviders 並新增所需的日誌記錄提供程式。例如,以下程式碼:

    • 呼叫 ClearProviders 以從生成器中刪除所有 ILoggerProvider 例項。

    • 新增控制檯日誌記錄提供程式。

    • public static IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
              .ConfigureLogging(logging =>
              {
                  logging.ClearProviders();
                  logging.AddConsole();
              })
              .ConfigureWebHostDefaults(webBuilder 
      => { webBuilder.UseStartup<Startup>(); });

      使用第三方替代,以Nlog為例

      修改program.cs

    • using System;
      using NLog.Web;
      using Microsoft.AspNetCore.Hosting;
      using Microsoft.Extensions.Logging;
      using Microsoft.Extensions.Hosting;
      
      public static void Main(string[] args)
      {
          var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
          try
          {
              logger.Debug("init main");
              CreateHostBuilder(args).Build().Run();
          }
          catch (Exception exception)
          {
              //NLog: catch setup errors
              logger.Error(exception, "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 IHostBuilder CreateHostBuilder(string[] args) =>
          Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            })
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog();  // NLog: Setup NLog for Dependency injection

      寫日誌

    • using Microsoft.Extensions.Logging;
      
      public class HomeController : Controller
      {
          private readonly ILogger<HomeController> _logger;
      
          public HomeController(ILogger<HomeController> logger)
          {
              _logger = logger;
              _logger.LogDebug(1, "NLog injected into HomeController");
          }
      
          public IActionResult Index()
          {
              _logger.LogInformation("Hello, this is the index!");
              return View();
          }