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

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

最佳答案

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

关于c# - 有没有更有效的方法来创建 nlog 数据库目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39364103/

相关文章:

c# - 通过WCF向服务器发送NLog日志

c# - 如何将 C# 接口(interface)的方法参数公开为特定的 COM/ODL 类型?

c# - 从与 exe 目录不同的文件夹引用 .net dll

c# - 动态添加复选框到gridview

sql-server - ElasticSearch 没有拉出整个 SQL 表

java - EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。以前的计数

c# - 如何在 Windows 10 中运行 Visual Studio 创建的 C# exe 文件?

c# - 两个相似的 LINQ 查询,生成的 SQL 完全不同

c# - NLog 内部记录器的编程配置

c# - NLog 不从引用的 dll 写入