Domanda

Sto facendo delle ricerche sull'uso di log4net e ho trovato interessante l'interfaccia IObjectRenderer . Ci consentirebbe di controllare il modo in cui i tipi vengono registrati e fornire un'implementazione ToString () diversa, forse più user-friendly. Ho appena iniziato a guardare log4net e non riesco a trovare un modo logico per impostare programmaticamente l'associazione tra tipi e renderer.

Ho scoperto che questo può essere impostato nel file di configurazione XML leggendo manual , ma non mi ha dato alcun suggerimento sull'aggiunta programmatica di questi. Mi sembra che in alcuni casi preferiresti avere un renderizzatore di oggetti programmatico, quindi sono curioso di sapere come farlo.

È stato utile?

Soluzione

Ho cercato un po 'di cose mentre scrivevo la domanda e ho pensato a questo:

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

Non sono sicuro che questo sia il modo corretto per farlo, ma so che ha funzionato.

Altri suggerimenti

Puoi anche aggiungere questa linea alla radice della tua log4net se non vuoi registrare il tuo renderer a livello di programmazione

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top