我正在尝试使用 'Database' NLog target并希望 NLog 读取我的连接字符串,以避免在同一个配置文件中将其设置两次。问题是我有一个 Entity Framework-style connection string ,因此使用 connectionStringName
属性不起作用。
在 log4net 中,我可以使用 custom AdoNetAppender并自己提取连接字符串的适当部分。有没有办法自定义 NLog 的数据库目标,以便我可以传入适当样式的连接字符串?
最佳答案
这个问题可以通过在代码中配置日志目标轻松解决:
private DatabaseTarget CreateDatabaseTarget()
{
var entityFrameworkConnection = ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString;
var builder = new EntityConnectionStringBuilder(entityFrameworkConnection);
var connectionString = builder.ProviderConnectionString;
var target = new DatabaseTarget()
{
ConnectionString = connectionString,
CommandText = @"insert into Log ([DateTime], [Message]) values (@dateTime, @message);",
Parameters = {
new DatabaseParameterInfo("@dateTime", new NLog.Layouts.SimpleLayout("${date}")),
new DatabaseParameterInfo("@message", new NLog.Layouts.SimpleLayout("${message}")),
}
};
return target;
}
然后您可以使用 NLog 配置注册它:
var target = CreateDatabaseTarget();
LogManager.Configuration.AddTarget("databaseTarget", CreateDatabaseTarget());
LogManager.Configuration.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Warn, target));
但是,如果您愿意接受一些 Nuget 依赖项或者想要更完整的解决方案,您可以查看 NLog.Mvc和 NLog.EntityFramework都有可用 nuget 包的存储库...
关于.net - 带有 Entity Framework 连接字符串的 NLog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9135453/