有没有更有效的方法来创建nlog数据库目标?

时间:2016-09-07 07:47:28

标签: c# sql-server nlog

我经常创建包含许多自定义列的日志,如:

<target xsi:type="Database" name="Log" dbProvider="System.Data.SqlClient" connectionString="...">
      <commandText>
        INSERT
        INTO [dbo].[Log]([Foo], [Bar], ...)
        VALUES(@FOO, @BAR, ...)
      </commandText>
      <parameter name="@FOO" layout="..." />
      <parameter name="@BAR" layout="..." />
      ...   
</target>

但我真的不喜欢我必须为每个列重复三次列的名称。这很难维护,也很容易犯错。

是否有更简单,更有效的方法来创建NLog数据库目标?

NLog可以单独从参数推断插入吗?如果我只能编写模式和表名,参数和INSERT非常明显的,那将是非常好的,所以它实际上可以自动构建。有没有这样的机制呢?

我添加了c#代码,因为如果有程序化解决方案,我更喜欢c#

2 个答案:

答案 0 :(得分:1)

我发现了一种方法。您需要更新CommandText的{​​{1}}。

DatabaseTarget

另请参阅CodeReview上的 Auto-INSERT query for NLog

答案 1 :(得分:1)

除了t3chb0t的答案。

配置更改后,您可以遍历所有数据库目标:

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();
    }
}