【问题标题】:Is there a more efficient way to create nlog database targets?有没有更有效的方法来创建 nlog 数据库目标?
【发布时间】:2016-09-07 07:47:27
【问题描述】:

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

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

【问题讨论】:

    标签: c# sql-server nlog


    【解决方案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();
        }
    }
    

    【讨论】:

    • 这是个好主意。没想到会有这样的活动。
    • 更新,它应该是 ConfigurationReloaded 而不是 ConfigurationChanged 以确保。我已经更新了示例
    【解决方案2】:

    我找到了办法。您需要更新CommandTextDatabaseTarget

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多