AspNet Core 5.0 и зарегистрировать собственный NLog LayoutRenderer

Я использую NLog.Web.AspNetCore 4.10.0 в своем приложении ASP Net Core 5.0. И я создал простой пользовательский ResultLayoutRenderer (сокращенный для простоты):

[LayoutRenderer("result-payload")]
public class ResultLayoutRenderer : AspNetLayoutRendererBase
{
    protected override void DoAppend(StringBuilder builder, LogEventInfo logEvent)
    {
        var httpRequest = HttpContextAccessor?.HttpContext?.Request;
        var result = httpRequest.Headers["Result"];
        builder.Append(result);
    }
}

Моя конфигурация NLog следующая:

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

    <!-- enable asp.net core layout renderers -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>
    
    <targets>
        <target xsi:type="Null" name="blackhole" />
        <target name="database" xsi:type="Database"
            dbProvider="Npgsql.NpgsqlConnection, Npgsql"
            dbHost="${configsetting:name=NlogConnection.DbHost}"
            dbDatabase="${configsetting:name=NlogConnection.Database}"
            dbUserName="${configsetting:name=NlogConnection.User}"
            dbPassword="${configsetting:name=NlogConnection.Password}"">
            
            <commandText>
                INSERT INTO logs (Application, Logged, Level, Message, Logger, Result) 
                VALUES (@Application, @Logged, @Level, @Message, @Logger, @Result);
            </commandText>
            
            <parameter name="@application" layout="AspNetCoreNlog" />
            <parameter name="@logged" layout="${date}" />
            <parameter name="@level" layout="${level}" />
            <parameter name="@message" layout="${message}" />
            <parameter name="@logger" layout="${logger}" />

            <parameter name="@result" layout="${result-payload}" />
            
        </target>
    </targets>
</nlog>

Я регистрирую ResultLayoutRenderer в Programm.cs:

public static void Main(string[] args)
{
    var logger = NLogBuilder.ConfigureNLog("nlog.config")
        .Setup()
        .SetupExtensions(s => s.RegisterLayoutRenderer<InputDataLayout>("result-payload"))
        .GetCurrentClassLogger();
        ..............
}

Но макет не работает. Внутренний файл журнала NLog содержит следующую информацию:

Error Error parsing layout input-payload will be ignored. Exception: System.ArgumentException: LayoutRenderer cannot be found: 'input-payload'
   at NLog.Config.Factory`2.CreateInstance(String itemName)
   at NLog.Layouts.LayoutParser.GetLayoutRenderer(ConfigurationItemFactory configurationItemFactory, String name, Nullable`1 throwConfigExceptions) 

person BackendAs    schedule 07.01.2021    source источник
comment
Ваш конфиг говорит ${result-payload} ;)   -  person Julian    schedule 07.01.2021
comment
@ Джулиан Да, извини. В вопросе была опечатка. я обновил вопрос   -  person BackendAs    schedule 07.01.2021
comment
Я думаю, следует перепроверить ваш код. typeof(InputDataLayout))) неверно, называется ResultLayoutRenderer. Я думаю, что это тоже проблема, путаница имен   -  person Julian    schedule 07.01.2021


Ответы (2)


Вы очень близки. NLogBuilder.ConfigureNLog(...) скоро устареет, поэтому вместо этого попробуйте следующее:

var logger = NLog.LogFactory.Setup()
    .SetupExtensions(s =>
         s.AutoLoadAssemblies(false)
          .RegisterNLogWeb()
          .RegisterLayoutRenderer<ResultLayoutRenderer>("result-payload"))
    )
    .LoadConfigurationFromFile("nlog.config")
    .GetCurrentClassLogger();

См. также: https://github.com/NLog/NLog.Web/blob/master/examples/ASP.NET%20Core%202/Visual%20Studio%202017/ASP.NET%20Core%202%20-%20VS2017/Program.cs

person Rolf Kristensen    schedule 07.01.2021

Это работает в моем веб-API ASP.NET Core 5:

public static void Main(string[] args)
{
    LayoutRenderer.Register<ElapsedTimeLayoutRenderer>("elapsed-time");
    var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
    // ...
}

https://github.com/NLog/NLog/wiki/НачалоработысASP.NET-Core-5 https://www.carlosjanderson.com/log-the-elapsed-time-between-log-entries-using-nlog/

person walterhuang    schedule 04.05.2021