AspNet Core 5.0并注册自定义NLog LayoutRenderer



我在ASP Net Core 5.0应用程序中使用NLog.Web.AspNetCore 4.10.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>

我在Programm.cs:中注册ResultLayoutRenderer

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) 

你非常接近。NLogBuilder.ConfigureNLog(...)很快就过时了,相反,建议使用fluent配置api:

var logger = NLog.LogFactory.Setup()
.SetupExtensions(ext =>
ext.RegisterLayoutRenderer<ResultLayoutRenderer>("result-payload")
)
.LoadConfigurationFromAppSettings()
.GetCurrentClassLogger();

另请参阅:https://github.com/NLog/NLog.Web/blob/master/examples/ASP.NET%20Core%205/ASP.NET%20Core%205%20NLog%20Example/Program.cs

这适用于我的ASP.NET Core 5 Web API:

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

// ...
}

https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-5https://www.carlosjanderson.com/log-the-elapsed-time-between-log-entries-using-nlog/

最新更新