努力在.NET 6 Web API中添加自定义NLOG布局渲染器

发布于 2025-01-24 12:03:36 字数 3413 浏览 3 评论 0原文

我有一个.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
DatabaseParameterInfo

ArgumentException: 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傻比既视感 2025-01-31 12:03:36

替换此行:

NLog.Logger logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

使用此行:

NLog.Logger logger = NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer<PropWorx.API.NLogLayoutRenderer>("newField")
).LoadConfigurationFromAppSettings().GetCurrentClassLogger();

另请参阅: 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:

NLog.Logger logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();

With this line:

NLog.Logger logger = NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterLayoutRenderer<PropWorx.API.NLogLayoutRenderer>("newField")
).LoadConfigurationFromAppSettings().GetCurrentClassLogger();

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文