2011-01-16 34 views
5

Tôi đang trong quá trình thực hiện hỗ trợ ghi nhật ký trong thư viện nguồn mở mà tôi đang làm việc. Hầu hết các thư viện của bên thứ ba dường như chọn một cách rõ ràng thư viện khai thác "ưa thích" như Log4Net hoặc NLog v.v ... và sau đó yêu cầu người tiêu dùng thư viện của họ "đối phó với nó". Rất may, chúng tôi có một thư viện như Common.Logging để giải quyết vấn đề này trong (các) ứng dụng tiêu thụ của chúng tôi hợp nhất các triển khai ghi nhật ký thư viện của bên thứ ba này.Triển khai Thư viện nguồn mở: Cách xử lý ghi nhật ký?

Tôi sẽ cố gắng tránh tham chiếu thư viện của bên thứ ba khác từ thư viện nguồn mở của riêng tôi để tránh đưa vào một tham chiếu lắp ráp khác vào ứng dụng của người khác. Có lẽ đây không phải là một mối quan tâm, và tôi nên dừng lại ở đó?

Giả sử rằng một số người đồng ý rằng tham chiếu lắp ráp quá mức gây khó chịu (và vì ai đó sẽ đề cập đến nó), cá nhân tôi không thích sử dụng ILMerge cho loại tình huống này, vì bạn có thể dễ dàng có một số thư viện sử dụng Log4Net và nếu mỗi ILMerged trong hội đồng, nó chỉ là bloating kích thước của một ứng dụng theo ý kiến ​​của tôi.

Để kết thúc, tôi đã nghĩ đến việc triển khai và hiển thị LogBridge để cho phép người dùng thư viện của tôi nối vào cuộc gọi đăng nhập của tôi nếu muốn (sẽ bị tắt theo mặc định). Ngoài ra, hãy để tôi nhấn mạnh rằng tôi không nói về việc triển khai khung đăng nhập của riêng mình, chỉ cần đảm bảo rằng tôi tiếp cận đăng nhập nếu ai đó quan tâm đến việc kết hợp nó. Tôi đã nghĩ rằng việc triển khai tiêu thụ sẽ xuất hiện như sau:

public class SomeSetupClass 
{ 
    private void SomeSetupMethod() 
    { 
    var log = LogManager.GetLogger("LogSourceName"); 
    var logBridge = new LogBridge() 
         { 
         DebugEnabled = log.IsDebugEnabled, 
         InformationEnabled = log.IsInfoEnabled, 
         WarningEnabled = log.IsWarnEnabled, 
         ErrorEnabled = log.IsErrorEnabled, 
         CriticalEnabled = log.IsFatalEnabled 
         }; 

    logBridge.DebugMessageReceived += (sender, e) => log.Debug(e.Message); 
    logBridge.InformationMessageReceived += (sender, e) => log.Info(e.Message); 
    logBridge.WarningMessageReceived += (sender, e) => log.Warn(e.Message); 
    logBridge.ErrorMessageReceived += (sender, e) => log.Error(e.Message); 
    logBridge.CrticalMessageReceived += (sender, e) => log.Fatal(e.Message);  } 
    } 
} 

Phương pháp này có hợp lý không? Tôi có nghĩ về điều này sau khi đi nghỉ quá lâu và tôi chỉ nên tham khảo Log4Net hoặc NLog v.v ... và được thực hiện với nó? Tôi có thiếu bất kỳ nhược điểm lớn nào của phương pháp này không? API thô có hợp lý không?

Như mọi khi, tò mò những gì mọi người nghĩ ...

Cập nhật

Tò mò nếu mọi người nghĩ rằng giải pháp jgauffin là cách tốt hơn để đi đâu? Tôi đã cho nó một số suy nghĩ trước khi đăng bài này; suy nghĩ của tôi là LogBridge sẽ dễ dàng hơn để kết nối với người tiêu dùng thay vì yêu cầu một giao diện tùy chỉnh được thực hiện trong một dự án tiêu thụ? Suy nghĩ?

+0

Một cái gì đó như thế này có ý nghĩa tốt. Có rất nhiều khung công tác đăng xuất - có một số khung tốt hơn so với các khung công tác khác. Mọi người đều yêu thích. Bằng cách cung cấp một móc tốt đẹp như bạn đang làm, bạn không đẩy bất cứ điều gì xuống cổ họng của bất kỳ ai, và bạn đang cung cấp sự linh hoạt tuyệt vời. – Pedro

Trả lời

1

Tìm trong hệ thống.Chẩn đoán và chỉ sử dụng các lớp Trace hoặc Debug. Các sản phẩm như Log4Net có thể chọn chúng khi cần thiết.

+0

Vâng, tôi cũng đã cân nhắc điều này. Tôi đã xem xét cách triển khai CustomTraceListener và mặc dù bạn có thể ghi đè lên việc xử lý TraceEvent; các API dường như mong đợi rằng bạn ghi đè Write/WriteLine tại thời điểm đó bạn bị mất TraveEventLevel. Vấn đề/Không vấn đề? –

+0

Không vấn đề - bạn đang kế thừa từ trình theo dõi cơ sở, và vì vậy bạn vẫn có thể xây dựng phương thức WriteLine() của bạn để tính đến điều đó (nếu bạn muốn). –

+0

Đủ công bằng ... đó là kế hoạch ban đầu của tôi anways ... chỉ bắt đầu xem xét một thay thế khi tôi thấy rằng Write/WriteLine là trừu tượng và phải được overriden ... cảm ơn cho đầu vào. –

1

Tôi thường làm điều này:

  1. Cung cấp một giao diện cho khai thác gỗ: ILogger
  2. Tạo một nhà máy logger sử dụng để lấy một logger: ILogger _logger = LogManager.GetLogger(typeof(ClassBeingLogged));
  3. Cung cấp thực hiện cơ bản như ConsoleLogger.

Bạn cũng có thể cung cấp các ví dụ trong wiki dự án của mình cho biết cách triển khai nlog hoặc log4net. Điều đó thường đủ.

các LogManager mất một ILogFactory đó là trách nhiệm của việc tạo ra việc thực hiện thực tế:

public class LogManager 
{ 
    ILogFactory _factory; 

    public static void Assign(ILogFactory factory); 
    public static ILogger GetLogger(Type typeBeingLogged); 
} 

public interface ILogFactory 
{ 
    ILogger GetLogger(Type typeBeingLogged); 
} 

này làm cho nó khá dễ dàng để thực hiện một bộ chuyển đổi cho bất kỳ khuôn khổ khai thác gỗ.

+0

Tôi đã đưa ra một số suy nghĩ về cách tiếp cận này; suy nghĩ của tôi là nhược điểm chính là người dùng phải triển khai và tiêm một triển khai thực hiện giao diện ghi nhật ký của bạn. Ấn tượng ban đầu của tôi là sẽ có nhiều công việc hơn cho người tiêu dùng hơn là chỉ ràng buộc khung công tác khai thác gỗ hiện có của họ với một API LogBridge rất đơn giản. Điều đó đang được nói, các ví dụ trong dự án Wiki là điều cần thiết khi bạn chỉ ra. Suy nghĩ? –

+0

Thường chỉ có hai lớp cần triển khai để làm việc. Bạn cũng có thể thực hiện một thực hiện nlog hoặc log4net mà bạn ilmerge (tôi không có nghĩa là bạn nên ilmerge log4net/nlog, nhưng các adapter cho các framework) và cung cấp các download riêng biệt trên trang web của bạn. Người dùng vẫn có thể sử dụng khung đăng nhập yêu thích của họ kể từ khi tải xuống chính chỉ có giao diện được xác định. – jgauffin

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