是否有更有效的方法来创建nlog数据库目标

本文关键字:创建 nlog 数据库 目标 方法 有效 是否 | 更新日期: 2023-09-27 18:05:54

我经常创建有很多自定义列的日志,如:

<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#

是否有更有效的方法来创建nlog数据库目标

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

我找到了一个方法。您需要更新DatabaseTargetCommandText

var config = NLog.LogManager.Configuration;
var dbTarget = config.AllTargets[0] as DatabaseTarget;
dbTarget.CommandText = "INSERT...";

参见CodeReview上NLog的Auto-INSERT query