asp.net-mvcnlogextensibilitylogz.io

NLog extensibility - How to add custom field using ExtendValues?


I try to add some custom fields to NLog using extensibility.

Part of my nlog.config file looks like that : (simplified for exhibit)

<nlog>
    <extensions>
        <add assembly="Logzio.DotNet.NLog"/>
    </extensions>

    <variable name="currentUser" value="test" />

    <targets async="true">
        <target name="logzio" type="Logzio" token="myToken">
          <contextproperty name="currentUser" layout="${currentUser}" />
        </target>
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="logzio" />
    </rules>
</nlog>

In every controller, I have something like that (I'm using ASP.NET MVC5)

private static Logger logger = LogManager.GetCurrentClassLogger();

Then I send my logs to logzio using

logger.Fatal("Something bad happens");

Right now, currentUser always have the value test, which is logical.

However, despite of the documentation, I don't understand how to dynamically change currentUser value by the ID of my current logged user.

Should I create a sort of factory ? (if yes, how ? I'm not at ease with factories)
Should I change my logger variable ? If so, how ?

A piece of code would be extremly welcome.

Thank you for pointing my out where I'm wrong

EDIT

After @Rolf's answer, I've created this custom layout renderer

[LayoutRenderer("custom-layout")]
public class CustomLayoutRenderer : LayoutRenderer
{
    public string IdUser { get; set; }


    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
        logEvent.Properties.Add("currentUser", "HowToPassCustomDataHere?");
        builder.Append("test from custom-layout");
    }
}

and I changed the nlog.config accordingly, adding

layout="${message} ${custom-layout}"

to my <target>

However, I still don't understand how to pass custom value to currentUser. In logz.io, I have "HowToPassCustomDataHere?" as a value of currentUser.

(BTW, ${aspnet-user-identity} is great and works fine ; however I'd like to understand how to pass a custom value to my layout renderer. In my case, something like ${aspnet-user-id})


Solution

  • You can try one of these NLog layoutrenderers to acquire the current username:

    You can also create your own custom NLog LayoutRenderer: https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer

    Example of how to provide it as currentUser:

        <target name="logzio" type="Logzio" token="myToken">
          <contextproperty name="currentUser" layout="${aspnet-user-identity}" />
        </target>