ASP.NET 8 MVC中NLog的aspnet-user-identity布局渲染器无输出问题
问题描述
在ASP.NET 8 MVC Web应用中使用NLog 5.3.11,尝试通过${aspnet-user-identity}和${aspnet-request-ip}记录用户标识与请求IP,但这两个字段在日志文件及数据库中均为空。已在nlog.config中配置对应布局渲染器,日志其他字段正常输出。
配置文件(nlog.config)
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="Info" internalLogFile="C:/Temp/Logs/internal-nlog-AspNetCore.txt"> <extensions> <add assembly="NLog.Web.AspNetCore" /> </extensions> <targets> <!-- File target --> <target xsi:type="File" name="file" fileName="C:/Temp/Logs/Template/Template_${shortdate}.log" layout="${longdate}|${aspnet-request-ip}|${aspnet-user-identity}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}" /> <!-- Database target --> <target xsi:type="Database" name="database" connectionString="${configsetting:item=ConnectionStrings.DefaultConnectionString}" dbProvider="System.Data.SqlClient.SqlConnection,System.Data.SqlClient" commandText="INSERT INTO Log (Logged, Level, Message, Logger, Exception, UserIdentity, RequestIP) VALUES (@logged, @level, @message, @logger, @exception, @useridentity, @requestip)"> <!-- Define database logging parameters --> <parameter name="@logged" layout="${longdate}" dbType="DateTime" /> <parameter name="@level" layout="${level}" /> <parameter name="@message" layout="${message}" /> <parameter name="@logger" layout="${logger}" /> <parameter name="@exception" layout="${exception:format=tostring}" /> <parameter name="@useridentity" layout="${aspnet-user-identity}" /> <parameter name="@requestip" layout="${aspnet-request-ip}" /> </target> </targets> <rules> <logger name="*" minlevel="Info" writeTo="file" /> <logger name="*" minlevel="Info" writeTo="database" /> </rules> </nlog>
日志示例(空字段部分)
2024-06-14 01:05:09.5523|||INFO|Rook.DataAccess.Sql.SqlDbManager|Getting SQL connection for database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0.| 2024-06-14 01:05:09.5546|||INFO|Rook.AppCore.Web.Filters.LogUserActivity|User 'mikesmith@gmail.com' accessed '/User'|
解决方案
调整NLog中间件注册顺序
在Program.cs中,必须保证NLog的注册在认证、授权服务之后,且中间件链中UseAuthentication()、UseAuthorization()要在路由之前。正确示例:var builder = WebApplication.CreateBuilder(args); // 先添加认证、授权服务 builder.Services.AddAuthentication(options => { // 你的认证配置 }).AddCookie(); builder.Services.AddAuthorization(); // 注册NLog builder.Logging.ClearProviders(); builder.Host.UseNLog(); var app = builder.Build(); // 中间件顺序:认证 -> 授权 -> 路由/控制器 app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();区分请求上下文与非请求上下文日志
日志中来自SqlDbManager的条目,大概率是在后台线程、DI构造函数或非HTTP请求环境中生成的,这类场景下NLog无法自动获取请求IP和用户身份。如果需要记录这些场景的用户信息,需手动传递:// 在请求上下文内获取用户信息后传入日志 var currentUser = User.Identity?.Name; _logger.Info("Executing SQL query | User: {User}", currentUser);确认NLog.Web.AspNetCore包安装状态
检查项目是否已正确安装NLog.Web.AspNetCore包,版本需与NLog主包一致(5.3.11)。可通过NuGet包管理器确认,或在.csproj中查看:<PackageReference Include="NLog.Web.AspNetCore" Version="5.3.11" />查看NLog内部日志排查加载问题
打开C:/Temp/Logs/internal-nlog-AspNetCore.txt,检查是否有关于aspnet-user-identity或aspnet-request-ip的错误提示(如“布局渲染器未找到”),若有则说明NLog.Web.AspNetCore扩展未正确加载,需重新安装或检查配置。
内容的提问来源于stack exchange,提问作者esr124
相关产品推荐
相关产品推荐

