簡體   English   中英

Controller 使用帶有 NLog 的 ASP.NET Core 6 似乎無法通過 DI 獲得正確的記錄器實例

[英]Controller using ASP.NET Core 6 with NLog appears not to get the correct logger instance via DI

通過 DI 獲取正確的記錄器時遇到問題,至少看起來是這樣。

這是 Program.cs 中的代碼:

var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
logger.Info("Service Init");
logger.Info($"  Log Level - Debug: {logger.IsEnabled(NLog.LogLevel.Debug)} Trace: {logger.IsEnabled(NLog.LogLevel.Trace)}");

try
{
  var builder = WebApplication.CreateBuilder(args);

  builder.Logging.ClearProviders();
  //builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
  builder.Host.UseNLog();

  builder.Services.AddControllersWithViews();

  var app = builder.Build();

  app.UseStaticFiles();
  app.UseRouting();

  app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");

  app.Run();
}
catch (Exception exc)
{
  // NLog: catch setup errors
  logger.Error(exc, "Stopped program because of exception");
  throw;
}
finally
{
  NLog.LogManager.Shutdown();
}

當我運行應用程序時,初始日志信息(記錄到文件)顯示日志級別的正確值,例如,如果我將 NLog.config 中的 minlog 設置為“Debug”,則該值在日志中顯示為 true,如果我更改類似它“跟蹤”日志顯示適當。

在 controller 中,當我嘗試使用以下內容記錄相同的信息時,它們總是錯誤的:

  _logger.Info($"Log Level - Debug: {_logger.IsEnabled(NLog.LogLevel.Debug)} Trace: {_logger.IsEnabled(NLog.LogLevel.Trace)}");

附加條款:

  • 在controller,任意controller,沒有日志寫入配置的日志文件。 唯一進入配置日志文件的是在 Program.cs 中創建的記錄器實例。
  • 我有許多其他解決方案使用您擁有 Program.cs 和 Startup.cs 的上一代設置。 這些解決方案還使用 CreateHostBuilder(args).Build() 而不是 WebApplication.CreateBuilder(args)。 上一代設置按預期工作。
  • NLog.Exensions.Logging 和 NLog.Web.AspNetCore 版本都是5.2.1
  • 主頁 Controller
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

還有更多注意事項:
我在 Program.cs 中注釋掉了記錄器,並利用它從 appsettings.config 中獲取配置。 我在 Program.cs 中創建記錄器實例時也使用了它,所以我知道配置是正確的:

  • builder.Host.UseNLog(new NLogAspNetCoreOptions() { LoggingConfigurationSectionName = "NLog" });

無論在 Program.cs 中創建記錄器實例,當我對傳遞到 controller 構造函數的記錄器實例執行快速觀察時,我都會看到以下內容。 提供程序類型看起來不錯,NLog,但它在哪里獲取配置我不知所措。

控制器中記錄器實例的快速觀察

最后,根據 Rolf 的建議,我將其添加到 Program.cs 中以查看 NLog 在做什么,不幸的是它沒有提供太多細節。 沒有列出配置信息:

  NLog.Common.InternalLogger.LogLevel = NLog.LogLevel.Trace;
  NLog.Common.InternalLogger.LogToConsole = true;
  NLog.Common.InternalLogger.LogFile = @"c:\temp\nlog-debug.txt";

日志 output 如下所示:

2023-01-08 08:58:50.5328 Debug ScanAssembly('NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c')
2023-01-08 08:58:50.6446 Debug ScanAssembly('NLog.Web.AspNetCore, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c')
2023-01-08 08:58:50.6610 Trace Assembly 'NLog.Web.AspNetCore, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c' will be hidden in callsite stacktrace
2023-01-08 08:58:50.9908 Debug Hide assemblies for callsite
2023-01-08 08:58:50.9914 Debug ScanAssembly('NLog.Extensions.Logging, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c')
2023-01-08 08:58:50.9914 Trace Assembly 'NLog.Extensions.Logging, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c' will be hidden in callsite stacktrace
2023-01-08 08:58:50.9914 Trace Assembly 'Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' will be hidden in callsite stacktrace
2023-01-08 08:58:50.9914 Trace Assembly 'Microsoft.Extensions.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' will be hidden in callsite stacktrace
2023-01-08 08:58:51.0219 Trace ParseNLogConfig

所以我覺得我應該刪除這篇文章,以防止人們追尋錯誤的道路;)

然而,解決方案很簡單,對我來說是一個非常愚蠢的錯誤。 在 nlog.config 我有這樣的東西:

  <logger name="<MyNameSpace>.*" maxLevel="Info" final="true" />

...其中<MyNameSpace>就是項目的名稱空間。

我在另一個解決方案中有類似的東西,但它不那么激進<MyNameSpace>.<SubNameSpace>

基本上我是從日志中刪除我不想要的垃圾,但我走得太遠了。

無論如何,教訓是要小心你的規則,因為你會把“適用的記錄器”從等式中剔除,讓你想知道為什么你的記錄器看起來不像你認為的那樣或表現得不像你認為的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM