我使用“NLog.Extensions.Logging”进行日志记录并需要记录用户身份,并发现可以使用“NLog.Web.AspNetCore”。 “nlog.config”文件配置为记录“aspnet-user-identity”。但是,当我查看日志时,用户身份部分始终是空字符串,其他列看起来相当不错。我错过了什么吗?
我的配置文件的一部分在这里:
<extensions>
<assembly="NLog.Web.AspNetCore" />
</extensions>
<parameter name="@identity" layout="${aspnet-user-identity}"/>
<logger name="*" minlevel="Trace" appendTo="database"/>
并且插入命令使用“@identity”参数将日志插入到db中,但它总是空的,就像我说的那样。
答案 0 :(得分:3)
我想我已经找到了这个问题,
发生了重大变化,IHttpContextAccessor服务不再默认注册。 (See announcement)
添加你的startup.cs:
public void ConfigureServices(IServiceCollection Services)
{
//call this in case you need aspnet-user-authtype/aspnet-user-identity
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
答案 1 :(得分:3)
对于我的案例,接受的答案不起作用(在ASP.NET Core 3.1上使用JwtSecurityToken), 后来意识到我只是忘了在我的JwtSecurityToken声明上添加ClaimTypes.Name。
现在可以正常工作了,不需要注册IHttpContextAccessor。
答案 2 :(得分:0)
我在搜索“ asp.net core nlog用户名”时发现了这个问题。最终,我找到了解决方案,并将其记录在后头。
问题
如何在NLog日志消息中包括当前登录用户的用户名?
解决方案
我在ASP.NET Core Web应用程序内使用NLog。我尝试使用${aspnet-user-identity}
布局渲染器,但由于使用自定义身份验证,因此确定该值为空。
进行一些挖掘之后,我发现可以从NLog访问存储为ASP.NET Session变量的值。因此,在对用户进行身份验证之后,我将其用户名填充到会话变量中,瞧!
这是验证用户身份后我调用的代码:
// Store username in session so we can access it from NLog logs.
httpContext.Session.SetString("NlogUser", contact.Username);
这是nlog.config中的布局渲染器行的样子
这是AspNetSession layout renderer的相应NLog文档。
答案 3 :(得分:0)
如果您最近升级了ASP.NET Core,则可能必须在program.cs中配置不同的NLog:
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
.CaptureStartupErrors(true)
.UseIISIntegration()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.ConfigureLogging((hostingContext, logging) =>
{
//logging.AddNLog(); //<--- Can remove (NLog.Extensions.Logging)
})
;
})
.UseNLog(); // <--- Call UseNLog off of IHostBuilder (NLog.Web)
}
请参阅https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3