Wie kann ich eine benutzerdefinierte IObjectRenderer in log4net registrieren?

StackOverflow https://stackoverflow.com/questions/175109

  •  05-07-2019
  •  | 
  •  

Frage

Ich mache ein paar Untersuchungen in log4net verwenden, und ich fand der IObjectRenderer Schnittstelle interessant. Es würde uns erlauben, zu kontrollieren, wie Typen werden protokolliert und bieten eine andere, möglicherweise benutzerfreundlicher ToString() Umsetzung. Ich habe gerade angefangen, obwohl bei log4net suchen, und kann nicht scheinen, eine logische Art und Weise zu finden, um programmatisch die Zuordnung zwischen Typen und Renderer aufgebaut.

Ich fand, dass dies in der XML-Konfigurationsdatei werden durch das Lesen der Handbuch , aber es hat mir keine Hinweise geben, um programmatisch diese hinzufügen. Es scheint mir, dass Sie eher einen programmatischen Objekt Renderer in einigen Fällen haben würde, also bin ich gespannt, wie dies zu tun.

War es hilfreich?

Lösung

stieß ich mit ihm um einiges während die Frage zu schreiben und kam mit dieser:

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

Ich bin nicht sicher, ob dies der richtige Weg ist, dies zu tun, aber ich weiß, dass es geklappt hat.

Andere Tipps

Sie können auch diese Zeile in der Wurzel Ihrer log4net hinzufügen, wenn Sie nicht wollen, Ihre Renderer programmatisch registrieren

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top