Question

Je fais des recherches sur l’utilisation de log4net, et j’ai trouvé l’interface IObjectRenderer intéressante. Cela nous permettrait de contrôler la manière dont les types sont enregistrés et de fournir une implémentation différente, peut-être plus conviviale ToString () . Cependant, je viens tout juste de commencer à regarder log4net et je n'arrive pas à trouver un moyen logique de configurer par association l’association entre les types et les rendus.

J'ai constaté que cela pouvait être configuré dans le fichier de configuration XML en lisant manuel , mais cela ne me donne aucune indication sur l'ajout par programmation de ces éléments. Il me semble que dans certains cas, vous préférez utiliser un rendu d’objet programmatique, je suis donc curieux de savoir comment procéder.

Était-ce utile?

La solution

J'ai fouillé avec pendant que je rédigeais la question et trouvai ceci:

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

Je ne suis pas sûr que ce soit la bonne façon de procéder, mais je sais que cela a fonctionné.

Autres conseils

Vous pouvez également ajouter cette ligne à la racine de votre log4net si vous ne souhaitez pas enregistrer votre moteur de rendu par programme

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top