Как мне зарегистрировать пользовательский IObjectRenderer в log4net?
Вопрос
Я изучаю использование log4net, и мне показался интересным интерфейс IObjectRenderer . Это позволило бы нам контролировать, как регистрируются типы, и предоставлять другую, возможно, более удобную для пользователя реализацию ToString ()
. Я только начал изучать log4net и не могу найти логического способа программно установить связь между типами и средствами визуализации.
Я обнаружил, что это можно настроить в файле конфигурации XML, прочитав manual , но это не дало мне никаких подсказок о программном добавлении их. Мне кажется, что в некоторых случаях вам лучше использовать средство визуализации программных объектов, поэтому мне интересно, как это сделать.
Решение
Я немного обдумал это, когда писал вопрос, и придумал следующее:
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);
}
}
}
}
Я не уверен, что это правильный способ сделать это, но я знаю, что это сработало.
Другие советы
Вы также можете добавить эту строку в корень вашей log4net, если вы не хотите регистрировать ваш рендерер программно
<renderer renderingClass="ConsoleApplication1.FooRenderer" renderedClass="ConsoleApplication1.Foo" />