C# 是否有更有效的方法来创建nlog数据库目标?
我经常创建包含许多自定义列的日志,如:C# 是否有更有效的方法来创建nlog数据库目标?,c#,sql-server,nlog,C#,Sql Server,Nlog,我经常创建包含许多自定义列的日志,如: 插入 进入[dbo].[Log]([Foo],[Bar],…) 值(@FOO,@BAR,…) ... 但是我真的不喜欢我必须为每个列重复三次列的名称。它很难维护,也很容易出错 是否有更简单、更有效的方法来创建NLog数据库目标 NLog能否仅从参数推断插入?如果我能写下模式和表名,参数和INSERT非常明显,那么它实际上可以自动构建,那就太好了。有这样的机制吗 我添加了c标记,因为如果有编程解决方案,我更喜欢c我找到了一种方法。您需要更新数据库目
插入
进入[dbo].[Log]([Foo],[Bar],…)
值(@FOO,@BAR,…)
...
但是我真的不喜欢我必须为每个列重复三次列的名称。它很难维护,也很容易出错
是否有更简单、更有效的方法来创建NLog数据库目标
NLog能否仅从参数推断插入?如果我能写下模式和表名,参数和INSERT
非常明显,那么它实际上可以自动构建,那就太好了。有这样的机制吗
我添加了
c
标记,因为如果有编程解决方案,我更喜欢c
我找到了一种方法。您需要更新数据库目标
的命令文本
var config = NLog.LogManager.Configuration;
var dbTarget = config.AllTargets[0] as DatabaseTarget;
dbTarget.CommandText = "INSERT...";
除t3chb0t答案外,另请参见CodeReview上的 配置更改后,您可以循环访问所有数据库目标:
private void Main() //or application_start
{
//init
GenerateDatabaseTargetQueries();
//update when config changes
LogManager.ConfigurationReloaded += (sender, args) => GenerateDatabaseTargetQueries();
}
public void GenerateDatabaseTargetQueries()
{
var databaseTargets = LogManager.Configuration.AllTargets.OfType<DatabaseTarget>();
foreach (var databaseTarget in databaseTargets)
{
//todo good init capacity for StringBuilder
var queryBuilder = new StringBuilder();
queryBuilder.Append("INSERT INTO [dbo].[Log]");
foreach (var dbParameter in databaseTarget.Parameters)
{
//append all the parameters to the query
}
databaseTarget.CommandText = queryBuilder.ToString();
}
}
private void Main()//或应用程序启动
{
//初始化
GenerateDatabaseTargetQueries();
//配置更改时更新
LogManager.ConfigurationReloated+=(发送方,参数)=>GenerateDatabaseTargetQueries();
}
public void generatedatabasetargetquerys()
{
var databaseTargets=LogManager.Configuration.AllTargets.OfType();
foreach(databaseTargets中的var databaseTarget)
{
//为StringBuilder提供良好的初始化能力
var queryBuilder=new StringBuilder();
Append(“插入[dbo].[Log]”;
foreach(databaseTarget.Parameters中的dbvar参数)
{
//将所有参数追加到查询中
}
databaseTarget.CommandText=queryBuilder.ToString();
}
}
这是个好主意。我甚至没想到会发生这样的事件。更新时,应该重新加载ConfigurationReload,而不是ConfigurationChanged以确保。我已经更新了这个例子