You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:57:09