2008-10-06 7 views
9

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 consignés et de fournir une implémentation différente, peut-être plus conviviale, de ToString(). J'ai juste commencé à regarder log4net cependant, et ne peux pas sembler trouver une manière logique de mettre en place par programme l'association entre les types et les moteurs de rendu.Comment enregistrer un IObjectRenderer personnalisé dans log4net?

J'ai trouvé que cela peut être mis en place dans le fichier de configuration XML en lisant le manual, mais il ne m'a pas donné d'indications sur l'ajout par programmation de ceux-ci. Il me semble que vous préféreriez avoir un rendu d'objet programmatique dans certains cas, donc je suis curieux de savoir comment faire cela.

Répondre

10

J'ai poussé avec elle un peu en écrivant la question et est venu avec 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 certain si cela est la bonne façon de le faire, mais je sais que cela a fonctionné.

3

Vous pouvez également ajouter cette ligne à la racine de votre log4net si vous ne voulez pas enregistrer votre renderer programatically

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" /> 
Questions connexes