2008-10-06 21 views
9

Tôi đang nghiên cứu sử dụng log4net và tôi thấy giao diện IObjectRenderer thú vị. Nó sẽ cho phép chúng tôi kiểm soát cách các loại được ghi lại và cung cấp một triển khai thực hiện khác nhau, có thể thân thiện hơn với người dùng ToString(). Tôi chỉ bắt đầu nhìn vào log4net mặc dù, và dường như không thể tìm thấy một cách hợp lý để lập trình liên kết giữa các loại và renderers.Làm cách nào để đăng ký IObjectRenderer tùy chỉnh trong log4net?

Tôi thấy rằng điều này có thể được thiết lập trong tệp cấu hình XML bằng cách đọc số manual, nhưng nó không cho tôi bất kỳ gợi ý nào về việc thêm các chương trình này theo cách lập trình. Dường như với tôi rằng bạn muốn có một trình renderer đối tượng có lập trình trong một số trường hợp, vì vậy tôi tò mò làm thế nào để làm điều này.

Trả lời

10

Tôi chọc xung quanh với nó một số trong khi viết các câu hỏi và đến với điều này:

using System.IO; 
using log4net; 
using log4net.Config; 
using log4net.ObjectRenderer; 
using log4net.Util; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BasicConfigurator.Configure(); 

      ILog log = LogManager.GetLogger(typeof(Program)); 
      var repo = LogManager.GetRepository(); 
      repo.RendererMap.Put(typeof(Foo), new FooRenderer()); 

      var fooInstance = new Foo() { Name = "Test Foo" }; 
      log.Info(fooInstance); 
     } 
    } 

    internal class Foo 
    { 
     public string Name { get; set; } 
    } 

    internal class FooRenderer : log4net.ObjectRenderer.IObjectRenderer 
    { 
     public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer) 
     { 
      if (obj == null) 
      { 
       writer.Write(SystemInfo.NullText); 
      } 

      var fooInstance = obj as Foo; 
      if (fooInstance != null) 
      { 
       writer.Write("", fooInstance.Name); 
      } 
      else 
      { 
       writer.Write(SystemInfo.NullText); 
      } 
     } 
    } 
}

Tôi không chắc chắn nếu điều này là đúng cách để làm điều này, nhưng tôi biết rằng nó làm việc.

3

Bạn cũng có thể thêm dòng này vào thư mục gốc của log4net của bạn nếu bạn không muốn đăng ký kết xuất đồ họa của bạn programatically

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" /> 
Các vấn đề liên quan