2012-02-03 114 views
5

我试图使用'Database' NLog target并希望NLog读取我的连接字符串以避免在同一个配置文件中设置两次。问题是我有一个Entity Framework-style connection string,所以使用connectionStringName属性不起作用。带实体框架连接字符串的NLog?

在log4net中,我可以使用custom AdoNetAppender并自己提取适当的连接字符串。有没有什么办法可以自定义NLog的数据库目标,这样我就可以传入一个适当样式的连接字符串了?

回答

7

这个问题可以通过配置日志目标代码迎刃而解:

var target = CreateDatabaseTarget(); 
LogManager.Configuration.AddTarget("databaseTarget", CreateDatabaseTarget()); 
LogManager.Configuration.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Warn, target)); 

,如果你是罚款,但:

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配置寄存器采取一些Nuget的依赖或想要一个更完整的解决方案,你可以看看NLog.MvcNLog.EntityFramework存储库谁都可以nuget包...

+2

应该指出,OP是您链接到的NLog.EntityFramework软件包的创建者。 – 2015-01-24 11:22:03

+1

是的,这个问题的结果是当时没有满意的答案。 :-) – ladenedge 2015-09-29 16:16:49

5

由于是sealed,所以无法自定义内置的DatabaseTarget。 而且没有任何其他扩展点,因为DatabaseTarget.InitializeTarget()总是会抛出一个异常,因为它无法与当前NLOG版本创建DbProviderFactory形式EF providerName="System.Data.EntityClient"

所以2.0.0.0,你必须下列选项:

  1. 您可以复制连接字符串,也可以使用DatabaseTarget数据库配置属性。
  2. 你可以从头开始编写自己的custom target
  3. 您可以提交功能请求,并等待其实施。
+0

当,我害怕那些是我唯一的选择。 – ladenedge 2012-02-07 02:51:17

0

一种方式来获得从的DbContext正常的连接字符串如下:

context.Database.Connection.ConnectionString 

假设你有适当的格式连接字符串,我认为这是更容易配置这样的目标:

1)在你的配置定义目标

<target name="database" type="Database" connectionString="${gdc:myConnectionString}"> 
    <commandText> 
     ... 
    </commandText> 

2)设置你的连接字符串在运行时

GlobalDiagnosticsContext.Set("myConnectionString", connectionString); 

这样,你不硬编码db目标行为。