How do I register a custom IObjectRenderer in log4net?

前端 未结 2 563
礼貌的吻别
礼貌的吻别 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:06

    You can also add this line to the root of your log4net if you don't want to register your renderer programatically

    <renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
    
    0 讨论(0)
  • 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.

    0 讨论(0)
提交回复
热议问题