如何在log4net中注册自定义IObjectRenderer?

时间:2008-10-06 16:43:19

标签: c# log4net

我正在研究使用log4net,我发现 IObjectRenderer 界面很有趣。它将允许我们控制类型的记录方式,并提供一个不同的,可能更加用户友好的ToString()实现。我刚刚开始查看log4net,似乎找不到以编程方式设置类型和渲染器之间关联的逻辑方式。

我发现可以通过阅读manual在XML配置文件中设置它,但它没有给我任何关于以编程方式添加这些内容的提示。在我看来,在某些情况下你宁愿拥有一个程序化对象渲染器,所以我很好奇如何做到这一点。

2 个答案:

答案 0 :(得分:10)

我在写这个问题的时候用了一些东西,然后提出了这个问题:

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

我不确定这是否是正确的方法,但我确实知道它有效。

答案 1 :(得分:3)

如果您不想以编程方式注册渲染器,也可以将此行添加到log4net的根目录

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