如何在 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);

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


浮云间
浏览 36回答 1
1回答

慕神8447489

不确定是否清楚,但是对于数据库目标,一条日志消息将是数据库中的一条记录。同样在这种情况下,数据库目标选项也值得检查。您的配置不起作用,因为${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”则不在消息中。
打开App,查看更多内容
随时随地看视频慕课网APP