努力在.NET 6 Web API中添加自定义NLOG布局渲染器
我有一个.NET 6 Web API。我将NLOG用于记录。我正在尝试使用NLOG记录自定义字段,但我正在努力使其工作。我正在关注此样本: https:// nlog -project.org/2015/06/30/extgending-nlog-is-easy.html 。
因此,我的nlog.config当前看起来像这样(我只是显示DB目标,因为这是我相信的唯一相关部分):
<target name="db"
xsi:type="Database"
dbProvider="MySqlConnector.MySqlConnection, MySqlConnector"
connectionString="some_connection_string"
commandType="StoredProcedure"
commandText="`abc`.`InsertLog`"
>
<parameter name="machineName" layout="${machinename}" />
<parameter name="logged" layout="${date}" />
<parameter name="logLevel" layout="${level}" />
<parameter name="message" layout="${message}" />
<parameter name="logger" layout="${logger}" />
<parameter name="properties" layout="${all-event-properties:separator=|}" />
<parameter name="callsite" layout="${callsite:fileName:true}" />
<parameter name="exception" layout="${exception:tostring}" />
<parameter name="callsiteLineNumber" layout="${callsite-linenumber}" />
<parameter name="stackTrace" layout="${stacktrace}" />
</target>
DB目标基本上称为MySQL存储的Proc。
现在,我想保留一个额外的自定义字段,因此我在关闭标签之前添加了此行:(
<parameter name="newField" layout="${newField}" />
我还将相关字段添加到MySQL存储的Proc)
然后创建了一个新类,从Layoutrenderer继承了:
using NLog;
using NLog.LayoutRenderers;
using System;
using System.Text;
namespace PropWorx.API
{
[LayoutRenderer("newField")]
public class NLogLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append("test");
}
}
}
I'我不确定这是我需要的吗?因为它不起作用。当我尝试启动API时,我会遇到此错误:
nlogConfigurationException:在设置属性“布局”时出错 databaseparameterinfo
参数exception:找不到layoutrenderer:'newfield'
拳头上。
public static void Main(string[] args)
{
// Exception is thrown on the following line:
NLog.Logger logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Info("Init main");
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog();
}
这发生在我的程序的非常 谢谢
I have a .Net 6 Web API. I use NLog for my logging. I'm trying to log a custom field with NLog, but I am struggling to get it to work. I'm following this sample: https://nlog-project.org/2015/06/30/extending-nlog-is-easy.html.
So my nlog.config currently looks like this (I'm just showing the db target as that's the only relevant part I believe):
<target name="db"
xsi:type="Database"
dbProvider="MySqlConnector.MySqlConnection, MySqlConnector"
connectionString="some_connection_string"
commandType="StoredProcedure"
commandText="`abc`.`InsertLog`"
>
<parameter name="machineName" layout="${machinename}" />
<parameter name="logged" layout="${date}" />
<parameter name="logLevel" layout="${level}" />
<parameter name="message" layout="${message}" />
<parameter name="logger" layout="${logger}" />
<parameter name="properties" layout="${all-event-properties:separator=|}" />
<parameter name="callsite" layout="${callsite:fileName:true}" />
<parameter name="exception" layout="${exception:tostring}" />
<parameter name="callsiteLineNumber" layout="${callsite-linenumber}" />
<parameter name="stackTrace" layout="${stacktrace}" />
</target>
The db target basically calls a MySql Stored Proc.
Now I'd like to save an extra, custom field, so I add this line just before the closing tag:
<parameter name="newField" layout="${newField}" />
( I also added the relevant field to the MySql Stored Proc)
Then I create a new class, inheriting from LayoutRenderer:
using NLog;
using NLog.LayoutRenderers;
using System;
using System.Text;
namespace PropWorx.API
{
[LayoutRenderer("newField")]
public class NLogLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
builder.Append("test");
}
}
}
I'm not sure if that's all I need? Because it's not working. I get this error when I try to start up the API:
NLogConfigurationException: Error when setting property 'Layout' on
DatabaseParameterInfoArgumentException: LayoutRenderer cannot be found: 'newField'
This happens on the very fist line of my Program.cs file:
public static void Main(string[] args)
{
// Exception is thrown on the following line:
NLog.Logger logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
try
{
logger.Info("Init main");
CreateHostBuilder(args).Build().Run();
}
catch (Exception exception)
{
logger.Error(exception, "Stopped program because of exception");
throw;
}
finally
{
NLog.LogManager.Shutdown();
}
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseNLog();
}
Any ideas where I;m going wrong? Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
替换此行:
使用此行:
另请参阅: https://github.com/nlog/nlog/nlog/wiki/register-your-custom-custom-compont--compontent#register-nlog-extensions-nlog-extensions-from-sembly-sembly-antime
也请参见: https:/ /GITHUB.com/nlog/nlog/wiki/getting-with-asp.net-core-6#3-update-programcs
Replace this line:
With this line:
See also: https://github.com/NLog/NLog/wiki/Register-your-custom-component#register-nlog-extensions-from-assembly-at-runtime
See also: https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6#3-update-programcs