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以确保。我已经更新了这个例子