我使用NLog在我的 Web API 应用程序(.Net 6)上写入日志,并且我需要在ConfigureServices
方法
内写入日志。
由于此时 ILogger 不可用,所以我使用这种方式写入日志:
var logger = LogManager.GetCurrentClassLogger();
logger.Log(NLog.LogLevel.Debug, "my data");
它可以正常工作并正确写入日志,
但问题是,如果此代码存在,则在整个应用程序和所有后续请求中,${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-动作}属性?
ps
我想再次指出,在之后发生的所有请求中,它们都是空的,
而不仅仅是在本文中的ConfigureServices 方法中。
LogManager.GetCurrentClassLogger()
当应用程序启动期间很早就调用时,在UseNLog()
自动注册 NLog.Web 扩展之前,需要手动执行此操作。确保
NLog.config
-file 注册扩展如下:替代寄存器扩展的代码如下:
当使用 NLog 排除问题时,建议使用NLog InternalLogger并寻找线索,同时使用
throwConfigExceptions="true"
. 另请参阅: https: //github.com/NLog/NLog/wiki/Logging-troubleshooting请注意
Startup.cs
, 和ConfigureServices
似乎是 NET5(及更早版本)的遗产。有了 NET6,微软开始销售一种不同的方法:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6