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

How to log single SQL table using NLog in C#?

我正在尝试使用 NLog 绕过参数值将单个 table 记录到使用 NLog 的每一列中。但不知何故,我无法登录 SQL table。

我尝试通过传递这样的代码来传递值,并在 web.config 中添加了目标和规则。

class

中的代码
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>

不知为何数据没有填充到 table。

有什么方法可以将数据填充到适当的列中吗? NLog 是正确的做法吗?

不确定是否清楚,但是对于数据库目标,一条日志消息将是数据库中的一条记录。我建议阅读 the tutorial. Also in this case the database target options 是很好的检查。

您的配置无法正常工作,因为 ${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:具有自定义属性:

我将在这里使用结构化日志记录。参见 structured logging

记录器调用:

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" 不在。