Как мне зарегистрировать пользовательский IObjectRenderer в log4net? - PullRequest
9 голосов
/ 06 октября 2008

Я изучаю использование log4net, и мне показался интересным интерфейс IObjectRenderer . Это позволило бы нам контролировать, как регистрируются типы, и предоставлять другую, возможно, более удобную для пользователя реализацию ToString(). Я только начал изучать log4net и не могу найти логического способа программно установить связь между типами и средствами визуализации.

Я обнаружил, что это можно настроить в файле конфигурации XML, прочитав руководство , но оно не дало мне никаких подсказок о программном добавлении этих файлов. Мне кажется, что в некоторых случаях вы предпочли бы иметь средство визуализации программных объектов, поэтому мне любопытно, как это сделать.

Ответы [ 2 ]

10 голосов
/ 06 октября 2008

Я немного обдумал это, когда писал вопрос, и придумал следующее:

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

Я не уверен, что это правильный способ сделать это, но я знаю, что это сработало.

3 голосов
/ 26 июля 2012

Вы также можете добавить эту строку в корень вашей log4net, если вы не хотите регистрировать ваш рендерер программно

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...