我使用 NLog 在我的 Web API 应用程序上写入日志,(.Net 6)
我需要写入 ConfigureServices 方法中的日志。
由于此时 ILogger 不可用,所以我使用这种方式写入日志:
var logger = LogManager.GetCurrentClassLogger();
logger.Log(NLog.LogLevel.Debug, "my data");
它可以工作并正确写入日志,
但问题是,如果此代码存在,则在整个应用程序和all后续请求中,${aspnet-request-url}和${aspnet-mvc-action}属性在日志中显示为空。
如果我删除此代码 - 它们在所有请求中都显示为完整。
我尝试将写入日志的方式更改为其他方式:
var sp = services.BuildServiceProvider();
var logger = sp.GetService<ILogger<Startup>>();
logger.LogDebug("my data");
也写得正确,但是两个属性${aspnet-request-url}和${aspnet-mvc-action}的问题还是一样,都显示为empty。
我的问题是:
一方面如何通过ConfigureServices方法中的NLog写入日志,
另一方面,不要丢失两个 ${aspnet-request-url} 和 ${aspnet-mvc-action} 属性?
附注
我想再次指出,在所有发生的请求中,它们都是空的之后,
不仅是在本文中,从配置服务方法。
在应用程序启动过程中很早就调用
LogManager.GetCurrentClassLogger()
时,在UseNLog()
自动注册NLog.Web扩展之前,需要手动执行此操作。
确保
NLog.config
注册扩展,如下所示:
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
来自这样的代码的替代寄存器扩展:
var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
注意
Startup.cs
和 ConfigureServices
似乎是 NET5(及更早版本)的遗产。有了 NET6,微软开始销售一种不同的方法:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6