Search code examples
asp.net-corenlog

NLog layout renderer for aspnet-user-identity not showing in log


I am trying to get the user identity from ASP.NET to log using NLog but it is not working. Nothing is logged for {aspnet-user-identity} or {aspnet-request-ip}. I have the layout renders in my nlog.config file, but the resulting log messages do not show values for the aspnet layout renderers. It's not logging this information in the file or the database.

The application is an ASP.NET 8 MVC web application. I'm using the latest version of NLog, 5.3.11.

Below is my nlog.config file:

<?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>

Here is the log file and you can see the aspnet-request-ip and aspnet-user-identity are empty strings:

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.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 executing SQL: SELECT [UserID], [UserName], [FirstName], [LastName], [Email], [RoleID], [RoleName] FROM [vUserDetails]|
2024-06-14 01:05:09.5546|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 SQL parameters: |
2024-06-14 01:05:09.5546|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 executing SQL: SELECT [AuthRuleID], [ResourceName], [RoleID], [RoleName] FROM [vAuthRuleDetails]|
2024-06-14 01:05:09.5546|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 SQL parameters: |
2024-06-14 01:05:09.5546|||INFO|Rook.AppCore.Web.Services.MvcAuthorizationService|User 'mikesmith@gmail.com' has role 'Admin' and has a matching role for resource 'User/Index'|
2024-06-14 01:05:09.5546|||INFO|Rook.AppCore.Web.Filters.LogUserActivity|User 'mikesmith@gmail.com' accessed '/User'|
2024-06-14 01:05:09.5546|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 executing SQL: SELECT [UserID], [UserName], [FirstName], [LastName], [Email], [RoleID], [RoleName] FROM [vUserDetails]|
2024-06-14 01:05:09.5546|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 36cb6abe-416b-403d-9ea3-381ab2b4cff0 SQL parameters: |
2024-06-14 01:05:10.0935|||INFO|Rook.DataAccess.Sql.SqlDbManager|Getting SQL connection for database manager instance 8469ab7b-fded-4324-b287-804124ba68bc.|
2024-06-14 01:05:10.0935|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 8469ab7b-fded-4324-b287-804124ba68bc executing SQL: SELECT [UserID], [UserName], [FirstName], [LastName], [Email], [RoleID], [RoleName] FROM [vUserDetails]|
2024-06-14 01:05:10.0935|||INFO|Rook.DataAccess.Sql.SqlDbManager|Database manager instance 8469ab7b-fded-4324-b287-804124ba68bc SQL parameters: |
2024-06-14 01:05:10.0935|||INFO|Rook.AppCore.Web.Filters.LogUserActivity|User 'mikesmith@gmail.com' accessed '/'|

Solution

  • After some more digging here online, I was able to find the problem. It was how I was setting up NLog in my Program.cs. Here is what I previously had:

    // Add NLog logger to services.
    builder.Services.AddSingleton<ILoggerProvider, NLogLoggerProvider>();
    LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
    

    Here is what I changed it to that works:

    // Add NLog logger to services.
    builder.Host.UseNLog();
    LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
    

    I'm guessing I was using an older example prior to .NET 6. Either way, it works, I see my user name and the IP.