Pergunta

Estou fazendo uma pesquisa em usar log4net e achei o IObjectRenderer de interface interessante. Ele nos permitiria controlar como os tipos são registrados e fornecer um possivelmente mais implementação ToString() diferente, user-friendly. Eu só comecei a olhar para log4net, porém, e não consigo encontrar uma maneira lógica de programação criada a associação entre tipos e representantes.

Eu achei que este pode ser configurado no arquivo de configuração XML através da leitura do manual do , mas não me deu nenhuma dica sobre como adicionar programaticamente estes. Parece-me que você preferir ter um renderizador objeto programático, em alguns casos, por isso estou curioso como fazer isso.

Foi útil?

Solução

Eu coloquei ao redor com ele algum tempo a escrever a pergunta e veio com esta:

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

Não estou certo se esta é a maneira correta de fazer isso, mas eu sei que ele trabalhou.

Outras dicas

Você também pode adicionar esta linha para a raiz do seu log4net se você não quiser registar o seu renderizador programaticamente

<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top