为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 C# 中使用 NLog 记录单个 SQL 表?

如何在 C# 中使用 NLog 记录单个 SQL 表?

PHP
浮云间 2024-01-20 15:52:23
我正在尝试使用 NLog 绕过参数值将单个表记录到使用 NLog 的每列中。但不知何故我无法登录到 SQL 表。我尝试通过传递这样的代码来传递值,并在 web.config 中添加目标和规则。类中的代码private static Logger _logger;public CustomToken(){    _logger = LogManager.GetLogger("apiUsageLogger");}_logger.Info("{clientname}", "test");_logger.Info($"clientusername", "test");_logger.Info($"route", "test");_logger.Info($"parameters", "test");_logger.Info($"isuserauthenticated", 1);在 web.config 中<target name="apiUsageLog" xsi:type="Database" connectionStringName="connStringName">        <commandtext>          INSERT INTO Table          (ClientName, ClientUserName, Route, Parameters, IsUserAuthenticated, Machine)          VALUES          (@clientname, @clientusername, @route, @parameters, @isuserauthenticated, @machine)        </commandtext>        <parameter name="@clientname" layout="${clientname}" />        <parameter name="@clientusername" layout="${clientusername}" />        <parameter name="@route" layout="${route}" />        <parameter name="@parameters" layout="${parameters}" />        <parameter name="@isuserauthenticated" layout="${isuserauthenticated}" />        <parameter name="@machine" layout="${machinename}" />      </target>    </targets>    <rules>      <<logger name="apiUsageLogger" minlevel="Info" writeTo="apiUsageLog" />    </rules>不知何故,数据没有填充到表中。有没有办法可以将数据填充到适当的列中?NLog 是正确的做法吗?
查看完整描述

1 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

不确定是否清楚,但是对于数据库目标,一条日志消息将是数据库中的一条记录。同样在这种情况下,数据库目标选项也值得检查。

您的配置不起作用,因为${clientusername}NLog 中不存在。

我将展示3个例子,希望能让事情清楚

示例 1:简单记录到数据库目标

记录器调用:

logger.Info("my info message");

配置:

<target name="apiUsageLog" xsi:type="Database" connectionStringName="connStringName">

    <commandtext>

        INSERT INTO Table

        (message, machinename)

        VALUES

        (@message, @machinenameParam)

    </commandtext>

    <parameter name="@messageParam" layout="${message}" /> <!-- this will be "my info message"-->

    <parameter name="@machinenameParam" layout="${machinename}" /> <!-- defined in NLog, see https://nlog-project.org/config/?tab=layout-renderers-->

    </target>

</targets>

my info message这将在数据库中创建一条带有计算机名称的日志记录。

示例 2:使用自定义属性:

我将在这里使用结构化日志记录。

记录器调用:

logger.Info("my info message with {Property1}", "value1");

配置:

<target name="apiUsageLog" xsi:type="Database" connectionStringName="connStringName">

    <commandtext>

        INSERT INTO Table

        (message, machinename, property1)

        VALUES

        (@message, @machinenameParam, @propertyParam1)

    </commandtext>

    <parameter name="@messageParam" layout="${message}" /> <!-- this will be "my info message"-->

    <parameter name="@machinenameParam" layout="${machinename}" /> <!-- defined in NLog, see https://nlog-project.org/config/?tab=layout-renderers-->

    <parameter name="@propertyParam1" layout="${event-properties:Property1}" /> <!-- this will be "value1" -->

    </target>

</targets>

这将在数据库中创建一条日志记录my info message with "Value1",其中包含计算机名称和自定义属性“value1”。


示例3:自定义属性,不全部在消息中

这结合了结构化日志记录和WithProperty. 为此,您至少需要 NLog 4.6.3。


记录器调用:


logger.WithProperty("Property2", "value2")

      .Info("my info message {Property1}", "value1");


配置:


<target name="apiUsageLog" xsi:type="Database" connectionStringName="connStringName">

    <commandtext>

        INSERT INTO Table

        (message, machinename, property1, property2)

        VALUES

        (@message, @machinenameParam, @propertyParam2)

    </commandtext>

    <parameter name="@messageParam" layout="${message}" /> <!-- this will be: my info message with "value1"-->

    <parameter name="@machinenameParam" layout="${machinename}" /> <!-- defined in NLog, see https://nlog-project.org/config/?tab=layout-renderers-->

    <parameter name="@propertyParam1" layout="${event-properties:Property1}" /> <!-- this will be "value1" -->

    <parameter name="@propertyParam2" layout="${event-properties:Property2}" /> <!-- this will be "value2" -->

    </target>

</targets>

这将在数据库中创建一条日志记录my info message with "Value1",其中包含计算机名称以及自定义属性“value1”和“value2”


请注意,现在消息中包含“value1”,而“value2”则不在消息中。


查看完整回答
反对 回复 2024-01-20
  • 1 回答
  • 0 关注
  • 30 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信