有没有更有效的方法来创建 nlog 数据库目标?
Is there a more efficient way to create nlog database targets?
我经常创建包含许多自定义列的日志,例如:
<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 可以仅从参数中推断插入吗?如果我可以编写模式和 table 名称、参数,并且 INSERT
非常 obvious,那么它实际上可以自动构建,那就太好了。现在有这样的机制吗?
我添加了 c#
标签,因为如果有程序化的解决方案,我更喜欢 c#
.
我找到了一个方法。您需要更新 DatabaseTarget
的 CommandText
。
var config = NLog.LogManager.Configuration;
var dbTarget = config.AllTargets[0] as DatabaseTarget;
dbTarget.CommandText = "INSERT...";
另请参见 CodeReview Auto-INSERT query for 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();
}
}
我经常创建包含许多自定义列的日志,例如:
<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 可以仅从参数中推断插入吗?如果我可以编写模式和 table 名称、参数,并且 INSERT
非常 obvious,那么它实际上可以自动构建,那就太好了。现在有这样的机制吗?
我添加了 c#
标签,因为如果有程序化的解决方案,我更喜欢 c#
.
我找到了一个方法。您需要更新 DatabaseTarget
的 CommandText
。
var config = NLog.LogManager.Configuration;
var dbTarget = config.AllTargets[0] as DatabaseTarget;
dbTarget.CommandText = "INSERT...";
另请参见 CodeReview Auto-INSERT query for 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();
}
}