¿Cómo registro un IObjectRenderer personalizado en log4net?
Pregunta
Estoy investigando el uso de log4net, y encontré que la interfaz IObjectRenderer es interesante. Nos permitiría controlar cómo se registran los tipos y proporcionar una implementación de ToString ()
diferente, posiblemente más fácil de usar. Sin embargo, recién comencé a buscar en log4net y parece que no puedo encontrar una forma lógica de configurar mediante programación la asociación entre tipos y procesadores.
Encontré que esto se puede configurar en el archivo de configuración XML leyendo manual , pero no me dio ninguna pista sobre cómo agregarlos mediante programación. Me parece que prefieres tener un renderizador de objetos programático en algunos casos, así que tengo curiosidad por cómo hacerlo.
Solución
Lo hurgué un poco mientras escribía la pregunta y se me 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 hacerlo, pero sí sé que funcionó.
Otros consejos
También puede agregar esta línea a la raíz de su log4net si no desea registrar su procesador de manera programática
<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />