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.

¿Fue útil?

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" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top