我正在尝试使用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是正确的方法吗?
[不确定是否清楚,但是对于数据库目标,一条日志消息将是数据库中的一条记录。我建议阅读the tutorial。同样在这种情况下,database target options也很好检查。
您的配置不起作用,因为NLog中不存在${clientusername}
。>
我将显示3个示例,希望可以使情况变得清楚
记录器调用:
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
和机器名称创建日志记录。
我将在此处使用结构化日志记录。参见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”将计算机名称和定制属性创建。
这结合了结构化日志记录和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”。