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



我正在尝试使用 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);

在网络配置中

<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 是正确的方法吗?

不确定是否清楚,但对于数据库目标,一条日志消息将是数据库中的一条记录。我建议阅读教程。同样在这种情况下,最好检查数据库目标选项。

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

我将展示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"不是。

相关内容

  • 没有找到相关文章

最新更新