How do I register a custom IObjectRenderer in log4net?

前端 未结 2 565
礼貌的吻别
礼貌的吻别 2021-01-02 08:57

I\'m doing some research into using log4net, and I found the IObjectRenderer interface interesting. It would allow us to control how types are logged and provide a

2条回答
  •  暖寄归人
    2021-01-02 09:19

    I poked around with it some while writing the question and came up with this:

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

    I am not certain if this is the correct way to do this, but I do know that it worked.

提交回复
热议问题