2008-10-06 36 views
9

Estoy investigando el uso de log4net, y encontré interesante la interfaz IObjectRenderer. Nos permitiría controlar cómo se registran los tipos y proporcionar una implementación diferente, posiblemente más fácil de usar ToString(). Empecé a buscar en log4net y parece que no puedo encontrar una forma lógica de establecer programáticamente la asociación entre tipos y procesadores.¿Cómo registro un IObjectRenderer personalizado en log4net?

Encontré que esto se puede configurar en el archivo de configuración XML leyendo el manual, pero no me dio ninguna pista sobre cómo agregar esto programáticamente. Me parece que preferirías tener un procesador de objetos programático en algunos casos, así que tengo curiosidad por saber cómo hacerlo.

Respuesta

10

Empujé un rato con él un poco al escribir la pregunta y se le ocurrió esto:

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

No estoy seguro de si esta es la forma correcta de hacer esto, pero sí sé que funcionaba.

3

También puede añadir esta línea a la raíz de su log4net si no desea registrar su procesador programáticamente

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" /> 
Cuestiones relacionadas