代码之家  ›  专栏  ›  技术社区  ›  OwenP

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

  •  9
  • OwenP  · 技术社区  · 17 年前

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

    我发现可以通过读取 manual

    2 回复  |  直到 7 年前
        1
  •  10
  •   OwenP    17 年前

    我在写问题的时候仔细研究了一下,得出了以下结论:

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

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

        2
  •  3
  •   Axle    13 年前

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

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