2012-01-03 56 views
8

Chúng tôi đang sử dụng NLog để đăng nhập vào ứng dụng web C# MVC3. Tất cả các bộ điều khiển của chúng tôi mở rộng cơ sở tùy chỉnh "ApplicationController" cho phép chúng ta truy cập vào các phương thức và thành viên liên tục cần thiết. .Loại lớp dẫn xuất C# cần thiết trong cơ sở để ghi nhật ký bằng NLog

Tôi muốn tất cả các bộ điều khiển để có thể truy cập Logger qua lớp cơ sở này, nhưng muốn các chi tiết của việc biết những gì có nguồn gốc lớp những điều khoản đăng nhập có nguồn gốc từ

điều khiển ứng dụng của chúng tôi trông như thế này:

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

    protected ApplicationController() 
    { 
     Context = new Entities(); 
    } 

Nếu bộ điều khiển dẫn xuất không ghi đè Trình ghi hơn tất cả các câu lệnh sẽ hiển thị chúng bắt nguồn từ Bộ điều khiển ứng dụng. Hiện nay, tôi đã có bản chất Logger cùng trong tất cả các bộ điều khiển có nguồn gốc. Ví dụ:

public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger 
    { 
     get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); } 
    } 

Rõ ràng đây là thực tiễn triển khai kém.

  1. Làm thế nào tôi có thể làm khô điều này? Cụ thể, sự hiểu biết của tôi về C# thiếu để hoàn thành chính xác nhiệm vụ cụ thể này là gì?
  2. Có mẫu ghi nhật ký mà tôi nên theo dõi không, tôi không phơi bày trực tiếp lớp học khai thác (NLog) không?

TIA!

Trả lời

12

Tôi không quen với NLog nhưng trong Log4Net cú pháp LogManager.GetLogger(this.GetType()) sẽ thực hiện những gì bạn muốn. GetType trả về kiểu lá trong hệ thống phân cấp thừa kế của bạn, ngay cả khi gọi trong lớp cơ sở ApplicationController, khi logger là lần đầu tiên tạo ra (ví dụ: về tiếp cận đầu tiên đến tài sản Logger) nó sẽ nhanh chóng nó với loại PropertyController

+0

Tôi nghĩ 'this.GetType(). Name' nên làm điều đó. –

+1

Đây chính là điều tôi đã làm. Tôi đã không nhận ra rằng this.GetType sẽ trả về lớp dẫn xuất nhất. Điều này cho phép tôi tạo một thuộc tính duy nhất trên ApplicationController và sau đó sử dụng trình ghi nhật ký đó trong suốt ứng dụng. –

+0

Vui mừng được giúp đỡ và cảm ơn vì đã đánh dấu: D –

0

Chỉ cần kiểm tra nLog wiki here

Trong hầu hết các trường hợp, bạn sẽ có một logger mỗi lớp, vì vậy nó làm cho tinh thần để cung cấp cho logger cùng tên với lớp hiện hành.

Làm cho tinh thần để làm điều đó như

public abstract class ApplicationController : Controller 
{ 
    protected Logger _logger; 
    protected virtual Logger Logger(string className) 
    { 
     return LogManager.GetLogger(className); 
    } 
} 


public class PropertyController : ApplicationController 
{ 
    private readonly DatatapeService _datatapeService; 
    private readonly PropertyService _propertyService; 
    protected override Logger Logger() 
    { 
     return base.Logger("PropertyController "); 
    } 
} 
+6

Tôi thực sự không thích cách tiếp cận đó. Nếu tôi làm điều đó, tôi sẽ sao chép và dán mã trong mọi bộ điều khiển. Nó cảm thấy sai lầm khi có nhiều sự trùng lặp. –

+0

@BobbyB snippet, lớp cơ sở chung?NLog sử dụng một mô hình flyweight cho cấu hình logger vì vậy chi phí tối thiểu. Các dòng do đăng nhập thực tế phần lớn là trùng lặp. – Gusdor

3

NLog API này là hơi khác so với Log4net. Bạn cần phải sử dụng

Logger = LogManager.GetLogger(GetType().Name); 

nếu bạn chỉ vượt qua các loại, LogManager sẽ mong đợi một loại logger (ví dụ: một logger tùy chỉnh)

+1

Tôi tìm thấy LogManager.GetLogger (GetType(). FullName) để có ích hơn –

+0

Cảm ơn @DavidHayes - đồng ý với bạn. Vì vậy, tương đương với 'GetCurrentClassLogger()' cho một thuộc tính lớp cơ sở sẽ sử dụng: 'get {return _logger ?? (_logger = LogManager.GetLogger (this.GetType(). FullName)); } ' – Beel

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