NLog与实体框架连接字符串?

lad*_*dge 7 .net entity-framework connection-string nlog

我正在尝试使用'Database'NLog目标,并希望NLog读取我的连接字符串,以避免在同一个配置文件中设置它两次.问题是我有一个Entity Framework样式的连接字符串,因此使用该connectionStringName属性不起作用.

在log4net中,我可以使用自定义AdoNetAppender并自己提取连接字符串的相应部分.有没有办法自定义NLog的数据库目标,所以我可以传入一个适当样式的连接字符串?

Val*_*ean 7

通过在代码中配置日志记录目标可以轻松解决此问题:

    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.MvcNLog.EntityFramework存储库,它们都有可用的nuget包...

  • 应该注意,OP是您链接到的NLog.EntityFramework包的创建者. (2认同)

nem*_*esv 5

没有办法自定义内置,DatabaseTarget因为它是sealed.并且没有任何其他扩展点,因为它DatabaseTarget.InitializeTarget()总是会抛出异常,因为它无法创建DbProviderFactoryEF 的形式providerName="System.Data.EntityClient"

因此,使用当前的NLog版本,2.0.0.0您必须遵循以下选项:

  1. 您可以复制连接字符串,也可以使用DatabaseTarget DB配置属性.
  2. 您可以从头开始编写自己的自定义目标.
  3. 您可以提交功能请求,并等待其实施.


Rol*_*sen 1

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