使用ASP.NETCore6和NLog的控制器似乎无法通过DI获得正确的记录器示例

kknvjkwl  于 2023-01-10  发布在  .NET
关注(0)|答案(1)|浏览(134)

通过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,类似地,如果我将其更改为“Trace”,则日志显示正确。
在控制器中,当我尝试使用以下命令记录相同的信息时,它们总是错误的:

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

补充说明:

  • 在控制器中,任何控制器都没有日志被写入到配置的日志文件中。只有来自Program.cs中创建的日志记录器示例的日志才会被写入到配置的日志文件中。
  • 我有许多其他解决方案使用上一代安装程序,其中有Program.cs和Startup.cs。这些解决方案还使用CreateHostBuilder(args).Build()而不是WebApplication.CreateBuilder(args)。上一代安装程序按预期工作。
  • NLog.扩展.日志记录和NLog.Web.AspNetCore版本均为5.2.1
  • 家庭控制器
public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

更多备注:

我在Program.cs中注解掉了logger,并利用它从appsettings. config中获取了配置。我在Program.cs中创建logger示例时也利用了它,因此我知道配置是正确的:

  • 生成器.主机.使用NLog(新建NLogAspNetCoreOptions(){日志配置节名称=“NLog”});

不管在Program.cs中创建日志记录器示例,当我快速查看传递到控制器构造函数的日志记录器示例时,我看到了下面的内容。提供者类型看起来不错,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";

日志输出如下所示:

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
t40tm48m

t40tm48m1#

所以我觉得我应该删除这个帖子,以防止人们沿着错误的道路追逐;)
尽管如此,解决方案很简单,而且是我犯的一个愚蠢的错误。在nlog.config中,我有这样的内容:

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

...其中<MyNameSpace>就是项目的名称空间。
我在另一个解决方案中有类似的东西,但它不太激进<MyNameSpace>.<SubNameSpace>
基本上我是从日志中删除我不想要的垃圾,但我走得太远了。
无论如何,教训是要小心你的规则,因为你会把“适用的记录器”的方程离开你想知道为什么你的记录器看起来不像或表现不像你认为它应该。

相关问题