2012-02-03 108 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目標行爲。