lad*_*dge 7 .net entity-framework connection-string nlog
我正在尝试使用'Database'NLog目标,并希望NLog读取我的连接字符串,以避免在同一个配置文件中设置它两次.问题是我有一个Entity Framework样式的连接字符串,因此使用该connectionStringName属性不起作用.
在log4net中,我可以使用自定义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;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用NLog配置注册它:
var target = CreateDatabaseTarget();
LogManager.Configuration.AddTarget("databaseTarget", CreateDatabaseTarget());
LogManager.Configuration.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Warn, target));
Run Code Online (Sandbox Code Playgroud)
但是,如果您可以使用一些Nuget依赖项或想要更完整的解决方案,那么您可以查看NLog.Mvc和NLog.EntityFramework存储库,它们都有可用的nuget包...
没有办法自定义内置,DatabaseTarget因为它是sealed.并且没有任何其他扩展点,因为它DatabaseTarget.InitializeTarget()总是会抛出异常,因为它无法创建DbProviderFactoryEF 的形式providerName="System.Data.EntityClient"
因此,使用当前的NLog版本,2.0.0.0您必须遵循以下选项:
NLog 4.5 添加了对从 Entity Framework 解析连接字符串的支持,因此可以直接使用它们:
https://github.com/NLog/NLog/pull/2510
另外,NLog DatabaseTarget 不再密封,因此如果需要特殊处理,也可以执行此操作。
执行特殊解析/查找逻辑的正常方法是注册一个自定义布局渲染器并在 ConnectionString-Layout 中引用它:
https://github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer
| 归档时间: |
|
| 查看次数: |
3781 次 |
| 最近记录: |