我正在尝试向我的数据库日志目标添加一些定制。 在我NLog.config我有这样的:NLog - 数据库目标的运行时参数
<target name="DatabaseExample1" xsi:type="Database"
dbProvider="System.Data.SqlClient"
dbDatabase="${event-context:item=dbDatabase}"
dbUserName="${event-context:item=dbUserName}"
dbPassword="${event-context:item=dbPassword}"
dbHost="${event-context:item=dbHost}"
commandText="${event-context:item=commandText}">
</target>
在我的C#代码,我有这样的:
protected override void updateBeforeLog(LogEventInfo info)
{
info.Properties["dbDatabase"] = "TempDB";
info.Properties["dbUserName"] = "username";
info.Properties["dbPassword"] = "password";
info.Properties["dbHost"] = "SERVER\\SQLSERVER";
info.Properties["commandText"] = "exec InsertLog @LogDate, @LogLevel, @Location, @Message";
info.Parameters = new DatabaseParameterInfo[] {
new DatabaseParameterInfo("@LogDate", Layout.FromString("${date:format=yyyy\\-MM\\-dd HH\\:mm\\:ss.fff}")),
new DatabaseParameterInfo("@LogLevel", Layout.FromString("${level}")),
new DatabaseParameterInfo("@Location", Layout.FromString("${event-context:item=location}")),
new DatabaseParameterInfo("@Message", Layout.FromString("${event-context:item=shortmessage}"))
};
log.Log(info);
}
但我发现了,上面写着一个SQL错误“必须声明标量变量” @LogDate “”。
属性正在工作,因为连接成功。但由于某些原因,这些参数与命令中的标量变量不是“绑定”的。
如果我在NLog.config文件手动创建的参数,它完美的作品:
<target name="DatabaseExample1" xsi:type="Database"
dbProvider="System.Data.SqlClient"
dbDatabase="${event-context:item=dbDatabase}"
dbUserName="${event-context:item=dbUserName}"
dbPassword="${event-context:item=dbPassword}"
dbHost="${event-context:item=dbHost}"
commandText="${event-context:item=commandText}">
<parameter name="@LogDate" layout="${date:format=yyyy\-MM\-dd HH\:mm\:ss.fff}" />
<parameter name="@LogLevel" layout="${level}" />
<parameter name="@Location" layout="${event-context:item=location}" />
<parameter name="@Message" layout="${event-context:item=shortmessage}" />
</target>
但是,这违背了能够自定义的CommandText和参数值在运行时的全部目的。
请帮我理解我需要做些什么来使目标正确获取参数的值。 谢谢!
更新
总的来说,我想有办法通过C#代码,自定义目标。我想依赖于NLog.config文件只需要很多。但看起来NLog与配置文件设置很相关,我试图在该约束内工作,但要尽可能灵活。有了这个数据库目标,如果我可以计算出如何以编程方式更新参数,那么我可以在配置文件中拥有一个相当通用的目标,然后更新LogEventInfo属性和参数以适应任何数据库连接或存储的需要程序来执行。
什么SQL命令实际上看起来像'InsertLog'是它或你有实际的代码..看起来像你缺少值关键字.. – MethodMan 2013-02-20 01:36:11
'InsertLog'是一个SQL Server数据库中的存储过程。所有实际的INSERT SQL都在那里。正如我上面提到的,如果我把' '标签放到NLog.config文件中,它就可以工作。 SQL部分正在工作。 –
jwatts1980
2013-02-20 14:42:39