Dot-Net

帶有實體框架連接字元串的 NLog?

  • February 6, 2019

我正在嘗試使用“數據庫”NLog 目標,並希望 NLog 讀取我的連接字元串,以避免在同一個配置文件中設置兩次。問題是我有一個實體框架風格的連接字元串,所以使用該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;
   }

然後你可以用你的 NLog 配置註冊它:

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

但是,如果您可以接受一些 Nuget 依賴項或想要更完整的解決方案,您可以查看NLog.MvcNLog.EntityFramework儲存庫,它們都有可用的 nuget 包…

無法自定義內置,DatabaseTarget因為它是sealed. 並且沒有任何其他擴展點,DatabaseTarget.InitializeTarget()因為它總是會拋出異常,因為它無法創建DbProviderFactoryEF 表單providerName="System.Data.EntityClient"

因此,對於目前的 NLog 版本2.0.0.0,您必須使用以下選項:

  1. 您可以複製連接字元串,也可以使用DatabaseTarget DB 配置屬性。
  2. 您基本上可以從頭開始編寫自己的自定義目標。
  3. 您可以送出功能請求,然後等待它實施。

引用自:https://stackoverflow.com/questions/9135453