log4net에 사용자 정의 iobjectrenderer를 어떻게 등록합니까?
문제
log4net을 사용하는 것에 대한 연구를하고 있는데 iobjectrenderer 흥미로운 인터페이스. 유형이 기록되는 방법을 제어 할 수 있고 다른 사용자 친화적 인 다른 제품을 제공 할 수 있습니다. ToString()
구현. 방금 log4net을보기 시작했지만 유형과 렌더러 간의 연관성을 프로그래밍 방식으로 설정하는 논리적 인 방법을 찾을 수없는 것 같습니다.
나는 이것이 XML 구성 파일에서 설정할 수 있음을 발견했습니다. 수동, 그러나 프로그래밍 방식으로 추가하는 것에 대한 힌트를주지 않았습니다. 어떤 경우에는 프로그래밍 방식의 객체 렌더러가있는 것 같습니다. 그래서 나는 이것을하는 방법이 궁금합니다.
해결책
나는 질문을 쓰면서 그것으로 약간 찌르고 이것을 생각해 냈습니다.
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" />
제휴하지 않습니다 StackOverflow