Dot-Net
帶有實體框架連接字元串的 NLog?
我正在嘗試使用“數據庫”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.Mvc和NLog.EntityFramework儲存庫,它們都有可用的 nuget 包…
無法自定義內置,
DatabaseTarget因為它是sealed. 並且沒有任何其他擴展點,DatabaseTarget.InitializeTarget()因為它總是會拋出異常,因為它無法創建DbProviderFactoryEF 表單providerName="System.Data.EntityClient"因此,對於目前的 NLog 版本
2.0.0.0,您必須使用以下選項:
- 您可以複製連接字元串,也可以使用DatabaseTarget DB 配置屬性。
- 您基本上可以從頭開始編寫自己的自定義目標。
- 您可以送出功能請求,然後等待它實施。