2012-02-03 33 views
5

Tôi đang cố gắng sử dụng 'Database' NLog target và muốn NLog đọc chuỗi kết nối của tôi để tránh phải đặt nó hai lần trong cùng một tệp cấu hình. Vấn đề là tôi có một Entity Framework-style connection string, vì vậy việc sử dụng thuộc tính connectionStringName không hoạt động.NLog với chuỗi kết nối Khung thực thể?

Trong log4net, tôi có thể sử dụng custom AdoNetAppender và trích xuất các phần thích hợp của chuỗi kết nối. Có cách nào để tùy chỉnh mục tiêu Cơ sở dữ liệu của NLog để tôi có thể truyền vào một chuỗi kết nối phù hợp không?

Trả lời

7

Vấn đề này có thể dễ dàng giải quyết bằng cách cấu hình mục tiêu khai thác gỗ trong mã:

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; 
    } 

Sau đó, bạn có thể đăng ký nó với cấu hình NLog của bạn:

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

Nhưng nếu bạn đang sử dụng tốt với lấy một số phụ thuộc Nuget hoặc muốn có một giải pháp hoàn chỉnh hơn, bạn có thể xem tại các kho NLog.MvcNLog.EntityFramework cả hai đều có gói nuget có sẵn ...

+2

Cần lưu ý rằng OP là tác giả của gói NLog.EntityFramework mà bạn đã liên kết tới. –

+1

Đúng, được tạo ra do câu hỏi này không có câu trả lời thỏa đáng vào thời điểm đó. :-) – ladenedge

5

Không có cách nào để tùy chỉnh được xây dựng trong DatabaseTarget vì đó là sealed. Và không có bất kỳ điểm mở rộng khác vì DatabaseTarget.InitializeTarget() sẽ luôn ném một ngoại lệ vì nó không thể tạo ra các hình thức DbProviderFactory EF providerName="System.Data.EntityClient"

Vì vậy, với phiên bản NLog hiện 2.0.0.0 bạn phải tùy chọn sau:

  1. Bạn có thể sao chép chuỗi kết nối hoặc bạn có thể sử dụng các thuộc tính cấu hình DB của DatabaseTarget.
  2. Bạn có thể tự viết custom target của riêng mình về cơ bản từ đầu.
  3. Bạn có thể gửi yêu cầu tính năng và chờ cho đến khi được triển khai.
+0

Dang, tôi sợ đó là lựa chọn duy nhất của tôi. – ladenedge

0

Một cách để có được một chuỗi kết nối bình thường từ một DbContext như sau:

context.Database.Connection.ConnectionString 

Giả sử bạn có chuỗi kết nối trong các định dạng thích hợp, tôi nghĩ rằng nó dễ dàng hơn để cấu hình các mục tiêu như thế này:

1) xác định mục tiêu trong cấu hình của bạn

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

2) thiết lập chuỗi kết nối của bạn tại thời gian chạy

GlobalDiagnosticsContext.Set("myConnectionString", connectionString); 

Bằng cách này, bạn không mã hóa hành vi mục tiêu của db.

Các vấn đề liên quan